はじめに
Jupyter Notebookを使っているときに、matplotlibでグラフを描くと普通はインラインで表示されますよね。先日、シンプルなコードなのにグラフがなかなかインライン表示できずに、少し手こずったので現象と対策をまとめてみました。
グラフが表示されない
問題が発生したのはこんなコードです(わかりやすくするために簡略化しています)。
セルを一番上から1個ずつ実行していくとこんな感じの画面になります。
グラフが表示されない(涙)・・・
「%matplotlib inline」を付けてみた
ネットで検索すると、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のバックエンドに切り替わってしまっているようですね。
これが仕様なのかどうかは定かではありませんが、同じような症状で困っている方は 「セルの結合」 お試しあれ。