2012-05-10 18 views
23

Chcę być w stanie ustalić pochodzenia figur, które tworzę za pomocą matplotlib, tj. Wiedzieć, która wersja mojego kodu i danych stworzyła te liczby. (Aby uzyskać więcej informacji na temat pochodzenia, zobacz artykuł this essay).Czy matplotlib może dodać metadane do zapisanych cyfr?

Wyobrażam sobie, że najprostszym rozwiązaniem byłoby dodanie numerów rewizji kodu i danych do metadanych zapisanych danych lub na przykład komentarzy w pliku postscriptowym.

Czy jest jakiś łatwy sposób to zrobić w Matplotlib? Wydaje się, że funkcja savefig nie jest w stanie tego zrobić, ale czy ktoś wymyślił możliwe rozwiązanie?

+1

Wystarczy dodać trochę tekstu do działki ... –

+3

To może być proste, ale nie chcę mieć do przedstawienia danych liczbowych do publikacji z "commit 5d3414b19986fe3c08df4088d87b8786a660c387" napisany pod spodem. – ihuston

+0

Następnie ukryj za pomocą [Steganography] (http://en.wikipedia.org/wiki/Steganography). Przepraszamy za głupie sugestie, ale nie jestem świadomy jakiejkolwiek obsługi tego w matplotlib. Sugeruję coś takiego, jak dodanie wartości piksela na pozycji (0,0), która różni się od tła wartością, którą można skorelować z wersją ... –

Odpowiedz

15

Nie wiem o sposób używając matplotlib, ale można 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 

Daje:

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

Na razie przyjmuję tę odpowiedź, ponieważ wydaje się, że nie ma możliwości dodania metadanych w matplotlib w sposób agnostyczny. – ihuston

8

Jeśli jesteś zainteresowany w plikach PDF, to można mieć spójrz na moduł matplotlib matplotlib.backends.backend_pdf. Na this link jest dobrym przykładem jej użycia, co może być „skondensowane” do następujących:

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

Jeśli generowania plików SVG, można po prostu dołączyć tekst jako komentarz XML na koniec SVG plik. Edytory takie jak Inkscape wydają się zachować ten tekst, nawet jeśli później edytujesz obraz.

Oto przykład, w oparciu o odpowiedź od Hooked:

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") 
Powiązane problemy