Может ли matplotlib добавлять метаданные к сохраненным цифрам?
Я хочу иметь возможность выяснить происхождение фигур, которые я создаю, используя matplotlib, то есть узнать, какая версия моего кода и данных создали эти цифры. (См. это эссе для получения дополнительной информации о происхождении.)
Я предполагаю, что наиболее простой подход состоял бы в том, чтобы добавить номера ревизий кода и данных в метаданные сохраненных фигур или как комментарии в файле postscript, например.
Есть ли простой способ сделать это в Matplotlib? Функция savefig
, похоже, не способна на это, но кто-то придумал приемлемое решение?
Ответы
Ответ 1
Я не знаю, как использовать matplotlib
, но вы можете добавить метаданные в png с помощью 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'}
Ответ 2
Если вас интересуют файлы PDF, вы можете посмотреть модуль matplotlib matplotlib.backends.backend_pdf
. В этой ссылке есть хороший пример его использования, который может быть "сконденсирован" в следующее:
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()
Ответ 3
Если вы создаете SVG файлы, вы можете просто добавить текст в виде комментария XML в конце SVG файла. Редакторы, такие как Inkscape, похоже, сохраняют этот текст, даже если впоследствии вы редактируете изображение.
Вот пример, основанный на ответе от 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")
Ответ 4
Начиная с matplotlib версии 2.1.0 команда savefig принимает аргумент ключевого слова metadata
. Вы передаете словарь с парой ключ/значение для сохранения.
Это полностью работает только с определенным бэкэндом 'agg'
для файлов PNG.
Для файлов PDF и PS вы можете использовать предварительно определенный список тегов.