質問: matplotlibを用いて作成したヒストグラムを保存したいのですが、以下のプログラムを実行すると、 画像が保存されるものの、中身を見ると真っ白な状態になってしまいます。 どなたか原因分かりますでしょうか。 ``` import matplotlib.pyplot as plt plt.hist(df['diff']) # ・・・jupyterにヒストグラムが表示される plt.savefig('graph.png') # ・・・中身を見ると真っ白 ``` `plt.savefig`の前後に`plt.show()`を入れても駄目。 Jupyterにて実行
回答: 以下のように `plt.hist` と `plt.savefig` を同じセルで実行するとどうでしょうか。私の環境ではこれで期待通りの挙動になりました。`plt.hist` を実行したセルと `plt.savefig` を実行したセルが違う場合(これらの関数に限らず `plt.plot`、 `plt.scatter` なども同様)、ユーザーから見ると待通りの動作とならないことがあるようです。原因については一番下に記載しました。 !画像の説明をここに入力 原因について: `plt.hist` や `plt.savefig` は内部の隠滅されたステートフルなグラフに対して、描画を行ったり、参照して保存を行う関数です(他にも `plt.plot` や `plt.scatter` など同様の関数はたくさんあります)。同じセルの範囲内であれば、それらの関数を使用しても同じグラフに対して操作や参照が行われます。しかし、セルを抜けるとそのグラフが初期化されてしまいます。そのため、前のセルにある `plt.hist` で描画したグラフを 後のセルで`plt.savefig` で保存しようと思っても、 前のセルを抜けるときにすでにグラフは初期化されてしまっているため、その初期化された真っ白いグラフの画像が保存されるということになります。 Matplotlib の Jupyter Notebook 上での挙動について検証している記事をみつけました。参考にどうぞ。