2012-05-10 67 views
23

我希望能夠確定使用matplotlib創建的數字的出處,即知道我的代碼和數據的哪個版本創建了這些數字。 (請參閱this essay瞭解更多有關出處的信息。)matplotlib可以將元數據添加到保存的圖形中嗎?

我想最直接的方法是將代碼和數據的修訂版號添加到保存的數字的元數據中,或作爲例如postscript文件中的註釋。

有什麼簡單的方法在Matplotlib中做到這一點? savefig功能似乎沒有這個能力,但有人提出了一個可行的解決方案?

+1

只需添加一些文字的情節... –

+3

這可能是簡單的,但我不希望有提交數據與公佈「commit 5d3414b19986fe3c08df4088d87b8786a660c387」寫在下面。 – ihuston

+0

然後使用[Steganography]隱藏它(http://en.wikipedia.org/wiki/Steganography)。抱歉愚蠢的建議,但我沒有意識到這在matplotlib中的任何支持。我的建議是像增加一個像素值在位置(0,0),與背景不同的值,你可以關聯修訂... –

回答

15

我不知道的使用matplotlib的一種方式,但你可以add metadata to png's with PIL

f = "test.png" 
METADATA = {"version":"1.0", "OP":"ihuston"} 

# Create a sample image 
import pylab as plt 
import numpy as np 
X = np.random.random((50,50)) 
plt.imshow(X) 
plt.savefig(f) 

# Use PIL to save some image metadata 
from PIL import Image 
from PIL import PngImagePlugin 

im = Image.open(f) 
meta = PngImagePlugin.PngInfo() 

for x in METADATA: 
    meta.add_text(x, METADATA[x]) 
im.save(f, "png", pnginfo=meta) 

im2 = Image.open(f) 
print im2.info 

這給:

{'version': '1.0', 'OP': 'ihuston'} 
+0

由於似乎無法以格式不可知的方式在matplotlib中添加元數據,因此我暫時會接受此答案。 – ihuston

8

如果你有興趣的PDF文件,那麼你可以有一個看看matplotlib模塊matplotlib.backends.backend_pdf。在this link有它的使用,這可能是「濃縮」成一個很好的例子如下:

import pylab as pl 
import numpy as np 
from matplotlib.backends.backend_pdf import PdfPages 

pdffig = PdfPages('figure.pdf') 

x=np.arange(10) 

pl.plot(x) 
pl.savefig(pdffig, format="pdf") 

metadata = pdffig.infodict() 
metadata['Title'] = 'Example' 
metadata['Author'] = 'Pluto' 
metadata['Subject'] = 'How to add metadata to a PDF file within matplotlib' 
metadata['Keywords'] = 'PdfPages example' 

pdffig.close() 
2

如果生成SVG文件,你可以簡單地添加文本在SVG的最後一個XML註釋文件。即使您隨後編輯圖像,Inkscape等編輯也會保留此文字。

下面是一個例子,基於從迷上了答案:

import pylab as plt 
import numpy as np 

f = "figure.svg" 
X = np.random.random((50,50)) 
plt.imshow(X) 
plt.savefig(f) 

open(f, 'a').write("<!-- Here is some invisible metadata. -->\n") 
相關問題