Подтвердить что ты не робот

Может ли matplotlib добавлять метаданные к сохраненным цифрам?

Я хочу иметь возможность выяснить происхождение фигур, которые я создаю, используя matplotlib, то есть узнать, какая версия моего кода и данных создали эти цифры. (См. это эссе для получения дополнительной информации о происхождении.)

Я предполагаю, что наиболее простой подход состоял бы в том, чтобы добавить номера ревизий кода и данных в метаданные сохраненных фигур или как комментарии в файле postscript, например.

Есть ли простой способ сделать это в Matplotlib? Функция savefig, похоже, не способна на это, но кто-то придумал приемлемое решение?

4b9b3361

Ответ 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 вы можете использовать предварительно определенный список тегов.