2012-05-10 10 views
23

Quiero ser capaz de determinar la procedencia de las figuras que creo utilizando matplotlib, es decir, para saber qué versión de mi código y los datos crearon estas figuras. (Ver this essay para más sobre procedencia.)¿Puede matplotlib agregar metadatos a las cifras guardadas?

Imagino que el enfoque más directo sería agregar los números de revisión del código y los datos a los metadatos de las figuras guardadas, o como comentarios en un archivo postscript por ejemplo.

¿Hay alguna manera fácil de hacer esto en Matplotlib? La función savefig no parece ser capaz de esto, pero ¿alguien ha encontrado una solución viable?

+1

Sólo añadir un texto a la trama ... –

+3

que podrían ser sencilla, pero yo no quiero tener que presentar cifras para su publicación con "commit 5d3414b19986fe3c08df4088d87b8786a660c387" escrito debajo. – ihuston

+0

Luego escóndelo usando [Steganography] (http://en.wikipedia.org/wiki/Steganography). Lo siento por sugerencias estúpidas, pero no estoy al tanto de ningún soporte para esto en matplotlib. Lo que sugiero es algo así como agregar un pixelvalue en posición (0,0) que difiera del fondo con un valor que pueda correlacionar con la revisión ... –

Respuesta

15

No sé de una manera usando matplotlib, pero se puede 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 

Esto da:

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

Voy a aceptar esta respuesta por el momento, dado que parece que no hay forma de agregar metadatos en matplotlib de forma independiente del formato. – ihuston

8

Si usted está interesado en archivos PDF, a continuación, puede tener una mira el módulo matplotlib matplotlib.backends.backend_pdf. En this link hay un buen ejemplo de su uso, lo que podría ser "condensado" en lo siguiente:

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

Si va a generar archivos SVG, sólo tiene que añadir texto como un comentario XML al final de la SVG archivo. Los editores como Inkscape parecen conservar este texto, incluso si posteriormente edita una imagen.

He aquí un ejemplo, basado en la respuesta del Enganchado:

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") 
Cuestiones relacionadas