我希望能够确定我使用 matplotlib 创建的图形的出处,即知道我的代码和数据的哪个版本创建了这些图形。 (有关出处的更多信息,请参阅这篇文章。)
我想最直接的方法是将代码和数据的修订号添加到保存的图形的元数据中,或者作为例如后记文件中的注释。
在 Matplotlib 中有什么简单的方法可以做到这一点吗?
savefig
函数似乎无法做到这一点,但有人想出了一个可行的解决方案吗?
我不知道使用
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'}
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()
matplotlib 版本 2.1.0 开始,savefig 命令接受关键字参数 metadata
。您传入一个字典,其中包含要保存的字符串键/值对。这只完全适用于 PNG 文件的
'agg'
后端。对于 PDF 和 PS 文件,您可以使用预定义的标签列表。
这是一个基于 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")
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)}