32

我希望能够确定我使用 matplotlib 创建的图形的出处,即知道我的代码和数据的哪个版本创建了这些图形。(有关出处的更多信息,请参阅这篇文章。)

我想最直接的方法是将代码和数据的修订号添加到已保存图形的元数据中,或者例如作为后记文件中的注释。

在 Matplotlib 中是否有任何简单的方法可以做到这一点?该savefig功能似乎无法做到这一点,但有人想出了一个可行的解决方案吗?

4

4 回答 4

19

我不知道使用的方法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'}
于 2012-05-11T13:53:27.397 回答
10

如果你对 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()
于 2013-07-04T04:55:33.007 回答
7

matplotlib 版本 2.1.0开始, savefig 命令接受关键字参数metadata。您传入带有要保存的字符串键/值对的字典。

这仅适用'agg'于 PNG 文件的后端。

对于 PDF 和 PS 文件,您可以使用预定义的标签列表。

于 2019-07-01T17:10:46.563 回答
2

如果您正在生成 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")
于 2014-08-14T15:52:11.163 回答