Jupyter Notebookでmatplotlibのグラフが表示されない

 Jupyter Notebookを使っているときに、matplotlibでグラフを描くと普通はインラインで表示されますよね。先日、シンプルなコードなのにグラフがなかなかインライン表示できずに、少し手こずったので現象と対策をまとめてみました。

 

 問題のコードはこんなコードです(わかりやすくするために簡略化しています)。

 

 セルを一番上から1個ずつ実行していくとこんな感じの画面になります。

グラフが表示されない・・・

 

 

 ネットで検索すると、Jupyter Notebookでmatplotlibのグラフが表示できないときの対策は、先頭に「%matplotlib inline」を付けましょうとか、最後に「plt.show()」を付けましょう、といった方法がよく出てきます。

 ところが、どちらをやってみてもダメなんですよね・・・

先頭に「%matplotlib inline」を付けた結果は下記。

 

 

 変わらずですね。いろいろ試行錯誤してみました。

別の仮想環境を作ったり、jupyterやmatplotlibを入れなおしたり・・・

 

結局、とあることをしたら表示できるようになりました。どうやったと思います?

 

 正解は、「複数のセルに分割して記述しているコードを一つにまとめる」でした。

こんな感じです。

 

 

 Jupyter notebookでは、プログラムを一つのセルにまとめて書こうが、複数のセルに分けて書こうが、セルを順番に実行していけば同じ動作をするものと信じていたのですが、matplotlibについては挙動が変わるようです。

 

 試しにセルの分割位置を変えてみるとこんな感じになります。

 

 1.「figureの生成」+「axesの追加」と「グラフのプロット」の間でセルを分割

 こちらは、plot()を実行する前に空のグラフが描画されています。

 

 2.「figureの生成」と「axesの追加」+「グラフのプロット」の間でセルを分割

 

 こちらは最初の結果と同じく何も描画されません。

 

 おそらく、matplotlibでは「figureの生成」が入っているセルを最後まで実行した時点で、グラフ描画が起動され、それ以降はグラフの内容が更新されても描画は実行されない。ということでしょうか?

 ちなみに、このコードの最後に、fig.show()を付けて強制的に描画させると、こんな結果になります。

 

 

 「figureの生成」が入っているセルの実行が完了した時点で、matplotlibのバックエンドが非GUIのもバックエンドに切り替わってしまっているようですね。

 これが仕様なのかどうかは定かではありませんが、同じような症状で困っている方はお試しあれ。

 

ではまた。