Jupyter Notebookでmatplotlibを使用する場合には、インポートする前に
%matplotlib inline
と記述しますよね?では…
- なぜ
inlineと入力しているのでしょうか? - 入力し忘れても動くことがあるのはなぜでしょうか?
%matplotlib notebookというコマンドもあるのをご存じでしょうか?
この記事では、matplotlib inlineの謎について解説していきたいと思います!
- Jupyte Notebookのmatplotlibの読み込み|%matplotlib inline
- %matplotlib inlineを指定したときの挙動
- %matplotlib inlineの意味はバックエンドの指定
- %matplotlib inlineは必要ない?
- %matplotlib notebook|インタラクティブモード
- オススメ|matplotlibとデータ分析の勉強方法
Jupyte Notebookのmatplotlibの読み込み|%matplotlib inline
Jupyter Notebookでmatplotlibを使用する場合、次のように読み込むことが多いと思います。
%matplotlib inline
import matplotlib.pyplot as plt
%matplotlib inlineを指定してから、matplotlib.pyplotをインポートしています。
pyplotモジュールについて詳しく知りたい方は、まず次の記事をご覧ください。
このとき%matplotlib inlineには、どんな意味があるのでしょうか?
今回は、%matplotlib inlineの謎について解説していきます。
%matplotlib inlineを指定したときの挙動
%matplotlib inlineを指定したときの挙動:
- グラフがアウトプット行に出力される
plt.show()を省略してもグラフが出力されるplt.show()でアウトプット行に2つ以上のグラフ表示可能
グラフがアウトプット行に出力される
%matplotlib inlineを実行してプロットを作成すると、アウトプット行に図が出力されます。

アウトプット行内(in line)にグラフが出力されるので、まさにinlineです。
Jupyter Notebookでは、アウトプットを確認しながらスクリプトを書くことが多いので、
- いちいちポップアップが出ない
- アウトプット行にグラフを表示できる
というのはとても便利です。
plt.show()を省略してもグラフが出力される
対話側実行環境やエディタでは、グラフの表示のためにplt.show()を実行する必要があります。
一方、%matplotlib inlineを使用したnotebook環境ではplt.show()を省略してもグラフが出力されます。
plt.show()の書き忘れはよくあるので、とても便利な機能だと思います。
一点注意したいのが、plt.show()を省略するとアウトプット行にLine2Dオブジェクトの場所が出力されます。

これはplt.plot()がLine2Dオブジェクトを返すため、それが表示されているだけです。
Notebookは実行結果をアウトプット行に表示しますよね。Notebookが、Line2Dオブジェクトが実行結果なのかな?と思って表示してくれています。
もし、これを表示させたくない場合はplt.show()を省略せず書いてもいいですね。

(この目的であればplt.show()である必要はないですが、なんとなく見やすい気はしなくもないです・・・)
plt.show()でアウトプット行に2つのグラフ表示
インプット行にplt.show()が記述されていると、その段階でグラフが出力されます。
これを利用すると、スクリプトをplt.show()で区切ることで2つ以上のグラフを1つのアウトプット行に表示できます。
x = np.linspace(0, 2*np.pi)
# 1つ目のグラフを描く
plt.plot(x, np.sin(x))
plt.show() # ここで1つ目のグラフ出力
# 2つ目のグラフを描く
plt.plot(x, np.cos(x))
plt.show() # ここで2つ目のグラフ出力

クイックに結果を確認する場合には手軽で良い方法だと思います。
とはいっても、これはあくまで異なる2つの図を出力しているだけです。
2つ以上のグラフを作成して、配置やタイトルなども調整したい場合はplt.subplotを使用しましょう。
オブジェクト志向でグラフを描画する場合には、plt.subplots()を使用する方が良いです。
%matplotlib inlineの意味はバックエンドの指定
%matplotlib inlineはmatplotlibのバックエンドをinlineに設定するという意味です。
matplotlibのバックエンドとは何でしょうか?
バックエンドとは?
バックエンドとは、グラフを出力するためのmatplotlibの内部処理です。
通常、ユーザーはフロントエンドと呼ばれるスクリプト部分を記述しています。
- フロントエンド:ユーザーが記述するスクリプト
- バックエンド:
matplotlib内の処理、グラフの出力形式に応じて処理する

matplotlibではバックエンドの種類を変更することによって、グラフの出力形式を
- inlineモードで出力
- pngファイルで出力・保存
- インタラクティブモードで出力(出力した図を操作して拡大などができる)
などに変更することができます。
他にもたくさんのバックエンドが存在します。
%matplotlib inlineは、バックエンドをアウトプット行出力用に設定するという意味です。
バックエンドの確認方法
バックエンドを確認したい場合には
matplotlib.get_backend()
を実行します。
%matplotlib inline
import matplotlib
matplotlib.get_backend()
# 'module://ipykernel.pylab.backend_inline'
たしかにinlineになっているようですね。
%matplotlib inlineは必要ない?
%matplotlib inlineを入力し忘れても、アウトプット行にグラフが表示された経験がある方もいるかと思います。
なぜでしょうか?
実は、notebook使用時のデフォルトのバックエンドはinlineになっているという情報があります。
そのため、比較的新しいバージョンのmatplotlibを使用していれば、%matplotlib inlineは必要がないようです。
ただ、具体的な情報ソースが見つからないので、とりあえずinlineは書いておいても良さそうです。
%matplotlib notebook|インタラクティブモード
このバックエンドでは、図をインタラクティブモードで出力します。
インタラクティブモードには:
- 図の領域の大きさ変更
- 図の平行移動、拡大・縮小
- アニメーション出力時に使用
することができるという特徴があります。
インタラクティブモードの出力例を紹介します。
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi)
y = np.sin(x)
plt.plot(x, y)
plt.show()
次のようなインタラクティブモードでグラフが出力されます。

各ボタンは次のような機能を持っています。

インタラクティブモードは便利な反面デメリットがあります。
- 終了ボタンを押さないと別のセルのグラフまで同じグラフに出力されてしまう
という点です。

複数のインプット行でグラフを出力する場合、いちいち終了ボタンを手で押す必要があるので不便ですね。
複数のインプット行でグラフを出力する場合はinlineの方が便利です。
アニメーションの作成方法については、次の記事で解説しています。
オススメ|matplotlibとデータ分析の勉強方法
今回は、matplotlibインポート時に指定する%matplotlib inlineの謎について解説しました。
matplotlibは奥の深いモジュールですが、なかなかわかりにくい部分もあります…。
そこで、グラフの作成方法、種類変更、凡例、タイトルの設定など網羅的にわかりやすく整理した記事を作りました。ぜひ参考にしてみてください。
また、データ分析初心者の方にはこちらの記事もおススメです。
私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。
何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。