matplotlib.pyplotのループでの警告メッセージ

事の経緯

Pythonのmatplotlibで何枚も図を描こうと以下のようなプログラムを書いて実行すると…

while True:
    fig=plt.subplots()
    #処理

実行結果

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_open_warning`).

何やら警告メッセージが…

一応、止まらずにプログラムは走りましたが、この警告メッセージはどういうことか紹介します。

意味

英文で書いてありますので、訳すと、

20以上の図が開かれました。pyplotインターフェース( matplotlib.pyplot.figure)を介して作成された図は、明示的に閉じられるまで保持され、メモリを大量に消費する可能性があります。

というように、明示的に閉じるコードを書かないと、以前の図がそのまま残り続けて、メモリをたくさん使いますよと丁寧に教えていただいていたわけです。

私のときは、たまたま図の描く量が少なかったために、プログラムは走りましたが、描く量が多いとout of memoryというエラーになると思います。

このように何か分からないメッセージが出たら、和訳することをおススメします。

解決方法

明示的に図を保持せずに、リリースするには以下のようなコードを書きましょう。

plt.clf()
plt.close()

ここで、plt.clf()は、描画した図を消します。

plt.close()は、図を描くパレット(plt.subplot())を消すという意味です。

実は、plt.close()だけでも、今回の警告メッセージが出ないのですが、実際は、メモリは解放されておらず、plt.clf()を入れることで、やっと解放するそうです。

参照元:https://qiita.com/Masahiro_T/items/bdd0482a8efd84cdd270

まとめ

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_open_warning`).

は、メモリを解放するため、plt.clf(),plt.close()を入れよう。