2012-05-10 11 views
23

Voglio essere in grado di accertare la provenienza delle figure che creo usando matplotlib, cioè per sapere quale versione del mio codice e dei dati ho creato queste figure. (Vedere this essay per ulteriori informazioni sulla provenienza.)Matplotlib può aggiungere metadati alle figure salvate?

Immagino che l'approccio più diretto sarebbe quello di aggiungere i numeri di revisione del codice e dei dati ai metadati delle figure salvate, o come commenti in un file PostScript, per esempio.

C'è un modo semplice per farlo in Matplotlib? La funzione savefig non sembra essere in grado di farlo ma qualcuno ha trovato una soluzione praticabile?

+1

basta aggiungere del testo per la trama ... –

+3

che potrebbe essere semplice, ma io non voglio avere a presentare dati per la pubblicazione con "commit 5d3414b19986fe3c08df4088d87b8786a660c387" scritto sotto. – ihuston

+0

Quindi nascondilo usando [Steganography] (http://en.wikipedia.org/wiki/Steganography). Ci scusiamo per suggerimenti stupidi ma non sono a conoscenza di alcun supporto per questo in matplotlib. Quello che sto suggerendo è qualcosa di simile all'aggiunta di un pixelvalue in posizione (0,0) che differisce dallo sfondo con un valore che è possibile correlare con la revisione ... –

risposta

15

non so di un modo utilizzando matplotlib, ma è possibile 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 

questo dà:

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

Per ora accetterò questa risposta, dato che sembra che non ci sia modo di aggiungere metadati in matplotlib in un formato agnostico. – ihuston

8

Se siete interessati a file PDF, quindi si può avere un guarda il modulo matplotlib matplotlib.backends.backend_pdf. A this link c'è un bel esempio del suo utilizzo, che potrebbe essere "condensato" in quanto segue:

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

Se si sta generando i file SVG, si può semplicemente aggiungere del testo come un commento XML alla fine del SVG file. Editori come Inkscape sembrano conservare questo testo, anche se successivamente modifichi un'immagine.

Ecco un esempio, in base alla risposta da 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") 
Problemi correlati