matplotlib 可以向保存的图形添加元数据吗?

问题描述 投票:0回答:5

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

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

在 Matplotlib 中有什么简单的方法可以做到这一点吗?

savefig
函数似乎无法做到这一点,但有人想出了一个可行的解决方案吗?

python matplotlib metadata
5个回答
21
投票

我不知道使用

matplotlib
的方法,但您可以使用 PIL
 将元数据添加到 png:

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'}
    

11
投票
如果您对 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()
    

9
投票

matplotlib 版本 2.1.0 开始,savefig 命令接受关键字参数 metadata

。您传入一个字典,其中包含要保存的字符串键/值对。

这只完全适用于 PNG 文件的

'agg'

 后端。

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


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

0
投票
这是一个老问题,但应该有一个更新的答案。

matplotlib 现在接受元数据字典作为参数。 svg、png 允许使用创建者标签。

from matplotlib import pyplot as plt plt.plot([1,2],[1,4]) f = "line.png" metadata={"Creator":"them"} plt.savefig(filename,metadata=metadata) plt.close()
请注意,对于 png 文件,检查元数据很困难,因为 gimp 不会看到它。 python PIL 库允许提取它:

from PIL import Image im2 = Image.open(f) print(im2.info) >{'Software': 'Matplotlib version3.6.2, https://matplotlib.org/', 'Creator': 'them', 'dpi': (100, 100)}
    
© www.soinside.com 2019 - 2024. All rights reserved.