Python
matplotlib

特にリモートでMatplotlibでグラフを描いて保存する際のトラブル予防策

リモート環境でmatplotlib.pyplot.plotを実行

DISPLAY変数がないリモート環境でmatplotlib.pyplot.plotを実行しようとすると

RuntimeError: Invalid DISPLAY variable

のような例外が出てしまいます。次の2パターンのいずれかで対策できます。

import matplotlib
import os

if "DISPLAY" is not in os.environ:
  matplotlib.use("Agg")

from matplotlib import pyplot

以上の方法がよく採用されますが、isortなどパッケージのソート順をいじるツールなどと相性が悪いです。次のように書けば、追加の記載なしでisortなどが問題なく使えます。ただし、程度の多少はわかりませんが、オーバーヘッドはあります。

from matplotlib import pyplot
import os

if "DISPLAY" is not in os.environ:
  pyplot.switch_backend("Agg")

図を複数保存

図を複数保存する際にもトラップがあります。次のpyplot.close()を書かないと2つ目以降のグラフが以前plotしたグラフの上に書かれてしまいます。savefigshowと違ってキャンバスを消してくれません。+忘れないようにしましょう。

windows = (scipy.signal.hamming, scipy.signal.hann, scipy.signal.blackman)
for window in windows():
  pyplot.plot(window(256))
  pyplot.savefig(window.__name__ + ".svgz")
  pyplot.close()