matplotlib 可以将元数据添加到保存的图形中吗?
Posted
技术标签:
【中文标题】matplotlib 可以将元数据添加到保存的图形中吗?【英文标题】:Can matplotlib add metadata to saved figures? 【发布时间】:2012-05-18 22:38:59 【问题描述】:我希望能够确定我使用 matplotlib 创建的图形的出处,即了解我的代码和数据的哪个版本创建了这些图形。 (有关出处的更多信息,请参阅this essay。)
我想最直接的方法是将代码和数据的修订号添加到已保存图形的元数据中,或者作为后记文件中的 cmets。
在 Matplotlib 中是否有任何简单的方法可以做到这一点? savefig
函数似乎无法做到这一点,但有人想出了一个可行的解决方案吗?
【问题讨论】:
只需在情节中添加一些文字... 这可能很简单,但我不想提交带有“commit 5d3414b19986fe3c08df4088d87b8786a660c387”的数字以供发布。 我主要使用 PDF 或 EPS,但我确实认为 EXIF 对其他人来说是一个好方法。我可能会考虑为 savefig 编写一个包装器,它将一个字符串添加到 JPEG 的 EXIF、对 EPS 文件的注释或将元数据添加到 PDF。我很感兴趣是否有人已经尝试过这样做。 EPS 文件只是文本文件,以 % 开头的行是注释。所以很容易自己添加几行。 PDF是压缩的EPS(或多或少),所以上面也应该工作,最好用一些PDF库来完成。 (我向您为追踪出处所做的努力表示敬意。我一直在为模型运行而做,但到目前为止还不是为了数字,可能现在就开始了。) 你有没有写过这样的包装器?我会感兴趣的。另一种方法是编写一个包装器,在每个存储的图形旁边简单地存储一个文本文件。 【参考方案1】:我不知道有什么方法可以使用matplotlib
,但你可以add metadata to png's with 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'
【讨论】:
我暂时接受这个答案,因为似乎无法以与格式无关的方式在 matplotlib 中添加元数据。【参考方案2】:如果你对 PDF 文件感兴趣,那么你可以看看 matplotlib 模块matplotlib.backends.backend_pdf
。在this link 有一个很好的用法示例,可以“浓缩”为以下内容:
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】:截至matplotlib version 2.1.0,savefig 命令接受关键字参数metadata
。你传入一个字典,其中包含要保存的字符串键/值对。
这仅适用于 PNG 文件的 'agg'
后端。
对于 PDF 和 PS 文件,您可以使用预定义的标签列表。
【讨论】:
【参考方案4】:如果您正在生成 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")
【讨论】:
以上是关于matplotlib 可以将元数据添加到保存的图形中吗?的主要内容,如果未能解决你的问题,请参考以下文章