YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業

upyter Notebookでmatplotlibを使用する場合には、インポートする前に

  • %matplotlib inline

と記述しますよね?では…

  • なぜinlineと入力しているのでしょうか?
  • 入力し忘れても動くことがあるのはなぜでしょうか?
  • %matplotlib notebookというコマンドもあるのをご存じでしょうか?

この記事では、matplotlib inlineの謎について解説していきたいと思います!

 

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をもっと学びたい方へYutaKaおすすめセレクション!

%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()を省略するとアウトプット行にオブジェクトの場所が出力されます。

もし、これを表示させたくない場合は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つ以上のグラフを作成して、配置やタイトルなども調整したい場合はsubplotを使用しましょう。

%matplotlib inlineの意味 =「バックエンドの指定」

%matplotlib inlinematplotlibのバックエンドを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は奥の深いモジュールですが、基本的なプロットはpyplotで作成できます。

次に読んで頂きたい記事はこちらです。pyplotの基本を速攻マスターできます。

他にもmatplotlibの記事を書いていますのでぜひご参考に!

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!