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
は奥の深いモジュールですが、なかなかわかりにくい部分もあります…。
そこで、グラフの作成方法、種類変更、凡例、タイトルの設定など網羅的にわかりやすく整理した記事を作りました。ぜひ参考にしてみてください。
また、データ分析初心者の方にはこちらの記事もおススメです。
私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。
何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。