はじめに
卒修論を筆頭に,以前作成した画像を手直しして再度作成したい場合があります.しかし,画像を作成したプログラムがどれであるかを忘れてしまい,時間をかけてプログラムを探したり書き直したりする場合も多いです.そこで,使用したプログラムの名前を画像のメタデータに埋め込んでプログラム捜索をしなくて済むようにします.
方法
matplolibの savefig の引数である metadata を使います.
import matplotlib.pyplot as plt
import warnings
def savefig_with_program_name(fname, program_name):
if "pdf" in str(fname):
metadata = {"Creator": program_name}
elif "png" in str(fname):
metadata = {"Author": program_name}
else:
# pdf, png 以外は適宜実装してください
warnings.warn(f"cannot save metadata", UserWarning)
plt.savefig(fname, metadata=metadata)
メタデータは PIL で可視化できます.
plot_sinewave.py
from PIL import Image
import numpy as np
x = np.linspace(0, 4*np.pi)
y = np.sin(x)
plt.plot(x, y)
savefig_with_program_name("sine_wave.png", __file__)
img = Image.open("sine_wave.png")
print(img.info)
# {
# 'Software': 'Matplotlib version3.10.0, https://matplotlib.org/',
# 'Author': '/home/.../plot_sinewave.py',
# 'dpi': (99.9998, 99.9998)
# }
上記のようにメタデータにプログラム名を埋め込むことができました.
終わりに
本当はwindowsのプロパティで可視化したかったのですが,簡単にはいかなそうなので断念...
論文出版も含めて外部に画像を公開する場合は,意図しない情報流出を避けるため,メタデータを消すよう注意してください.
参考文献
- plt.savefig https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.savefig.html
- pngを保存するときのメタデータの仕様 https://matplotlib.org/stable/api/backend_agg_api.html#matplotlib.backends.backend_agg.FigureCanvasAgg.print_png
- pdfを保存するときのメタデータの仕様 https://matplotlib.org/stable/api/backend_pdf_api.html#matplotlib.backends.backend_pdf.PdfPages