まっしーの貯蔵庫

思考のゴミ箱

【Python】グラフをたくさん作るときの注意

これが、僕がブログを始めてから初の、誰かにとってお得情報になるかもしれない記事である。


pythonで、訳あってたくさんグラフを作るコードを書いていた。
使用するモジュールはmatplotlib.pyplotである。


普段、一個しかグラフを作らない場合は、例えば

import matplotlib.pyplot as plt
X=[1,2,3,4,5]
Y=[2,4,6,8,10]
plt.plot(X,Y)
plt.show()

の五行でグラフは出せる。

ところが、出力するグラフが多くなって、20を超える場合。例えば

import numpy as np
import matplotlib.pyplot as plt

…

for m in range(0,len(list)):      ##listの要素数は3000ぐらい
 for mag in lis:        ##lisの要素数は8
  if mag <= ave_mag_list[m] < mag+1 and std_mag_list[m] >=sigma_3[lis.index(mag)]:
   plt.figure()
   plt.title("〇〇の相関")
   plt.xlabel("ヨコ軸")
   plt.ylabel("タテ軸")
   plt.plot(ヨコ軸のリスト,タテ軸のリスト,"bo",color="b")
   plt.errorbar(ヨコ軸のリスト,タテ軸のリスト,yerr=誤差のリスト,fmt="ro",ecolor="r")
   plt.savefig("チョメチョメ"+str(名前のカタログ番号)+".png")

みたいなコードを書いたとき。

(これは今日僕が書いたコードを一部安直に書き直したものである。実際は日本語をコード内に書くには

u'ひょろひょろ'

としないといけないが、主題でないのでスキップ。わからん人はググること。僕も知らない。 )

すると、あまりにもメモリを食うと

RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (matplotlib.pyplot.figure) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam figure.max_num_figures). max_open_warning, RuntimeWarning)

というエラーを吐く場合がある。
意味は、「グラフ作りすぎだずぅ、メモリ食い過ぎてて逼迫すっがらっで、これ以上計算すっとテキトーに投げっがらな」
という意味だ。ちなみに、これは東北某県の方言を意識したつもりだが、僕はそんなに得意ではない。

じゃあどうするかというと、

…
plt.savefig()
plt.close()

と、plt.close()という表現を最後に付け加えると良い。
これは、毎度毎度グラフを書きっぱなしで放置するとメモリを食ってしまうので、書いたら消す、書いたら消す、というふうにしているのである。

実際、この部分を入れたら、できたグラフの個数が少し増えた。



一応、日本語のpythonの解説ページでもplt.close()の紹介はないわけではない。しかし、他の操作に比べてだいぶ少なかったので、これを公開メモとする。


なお、StackOverFlowの皆様によると、グラフを閉じるやり方は他にも二つほどあるが、役割が違うらしい。よくわからなかった。とりあえずplt.close()はグラフ全体を消す命令だそうだ。この辺はもう少し調べる必要がある。