matplotlibはグラフを使った可視化の際によく使われるモジュールで、Python上でもMatlabのようなグラフ描画機能を持たせることを目的として作られました。

NumPyとの相性ともよく、併用されることがほとんどです。この節では

  • matplotlibのインストール方法
  • matplotlibの簡単な使い方

について解説します。

matplotlibのインストール方法

前節まででpython3系がインストールされているはずなので以下のコードをコマンドライン上で実行すればmatplotlibが自動的にインストールされます。

$ pip install matplotlib

matplotlibチュートリアル

簡単に使い方を見ていきましょう。

最初にmatplotlibモジュールのインポートです。pyplotはmatplotlibのオブジェクト指向ライブラリに対する手続き型インターフェースを提供してくれます。

Jupyter Notebook上で使用する際は

%matplotlib inline

を入れるのを忘れないようにしましょう。これがないとIPythonやJupyter notebook上で結果表示画面でグラフが表示されません。

In [1]: import numpy as np

In [2]: import matplotlib.pyplot as plt # pltとしてインポートされるのが慣例です。

まずはプロットしてみよう

まずは簡単な作図をしてみます。
サイン波をプロットしてみましょう。

In [1]: import numpy as np

In [2]: import matplotlib.pyplot as plt # pltとしてインポートされるのが慣例です。

In [3]: X = np.linspace(-10, 10, 1000)

In [4]: y = np.sin(X) # サインの値を計算する

In [5]: plt.plot(X, y) # これでプロットをする。plotで点と点同士をなめらかにつなぐ
Out[5]: [<matplotlib.lines.Line2D at 0x1093f7550>]

In [6]: plt.show() # グラフの表示

最後のplt.show()でプロットしたグラフを表示させることができます。
表示されたグラフは以下のようになります。

plt.show()

とりあえず大体の形を見たいだけならこれだけで充分です。
では見た目をきれいにしていきます。
グリッドを入れて値を見やすくしましょう。

In [7]: plt.grid(True)

In [8]: plt.plot(X, y)
Out[8]: [<matplotlib.lines.Line2D at 0x1105a3d30>]

In [9]: plt.show()

グリッド

軸ラベルとタイトルの指定

では次は軸のラベルとタイトルをつけます。

In [10]: plt.title('sine wave')
Out[10]: Text(0.5,1,'sine wave')

In [11]: plt.xlabel('X') # x軸のラベル
Out[11]: Text(0.5,0,'X')

In [12]: plt.ylabel('y') # y軸のラベル
Out[12]: Text(0,0.5,'y')

In [13]: plt.plot(X, y)
Out[13]: [<matplotlib.lines.Line2D at 0x113523160>]

In [14]: plt.show()

タイトルとラベル

うまくつけられました。

表示する値の範囲を変更する

x軸とy軸の値の範囲を変えることもできます。

In [15]: plt.xlim(-5,5) # -5から5の範囲に
Out[15]: (-5, 5)

In [16]: plt.ylim(-0.5, 1.0) # -1から1の範囲に
Out[16]: (-0.5, 1.0)

In [17]: plt.plot(X, y)
Out[17]: [<matplotlib.lines.Line2D at 0x110da8320>]

In [18]: plt.xlabel('X')
Out[18]: Text(0.5,0,'X')

In [19]: plt.ylabel('y')
Out[19]: Text(0,0.5,'y')

In [20]: plt.title('limited scale')
Out[20]: Text(0.5,1,'limited scale')

In [21]: plt.show()

値の範囲

このように範囲を設定するとその範囲から逸脱した値はプロットされません。

色々なグラフをプロットしてみる

matplotlibは様々な種類のグラフをプロットすることが可能です。

散布図のプロット

散布図をプロットしてみましょう。

In [22]: x = np.random.randn(1000)  # 標準正規分布に従った乱数を1000個作成

In [23]: y = np.random.randn(1000)

In [24]: plt.scatter(x, y)
Out[24]: <matplotlib.collections.PathCollection at 0x11144ae10>

In [25]: plt.title('scatter')
Out[25]: Text(0.5,1,'scatter')

In [26]: plt.xlabel('x')
Out[26]: Text(0.5,0,'x')

In [27]: plt.ylabel('y')
Out[27]: Text(0,0.5,'y')

In [28]: plt.grid() # Trueを入れなくてもgridは入る

In [29]: plt.show()

散布図

ヒストグラムの作成

ヒストグラムも作成することができます。では先ほど作成した標準正規分布の値を使ってヒストグラムを作成してみましょう。

In [30]: plt.hist(x) # ヒストグラムの作成
Out[30]:
(array([  2.,  16.,  51., 142., 254., 260., 178.,  70.,  21.,   6.]),
 array([-3.45467525, -2.78074918, -2.10682311, -1.43289703, -0.75897096,
        -0.08504489,  0.58888119,  1.26280726,  1.93673334,  2.61065941,
         3.28458548]),
 <a list of 10 Patch objects>)

In [31]: plt.xlabel('x')
Out[31]: Text(0.5,0,'x')

In [32]: plt.ylabel('frequency')
Out[32]: Text(0,0.5,'frequency')

In [33]: plt.show()

ヒストグラム

重ね合わせのプロット

複数のグラフを重ね合わせてプロットすることもできます。

In [34]: x = np.linspace(-10, 10, 1000)

In [35]: y_1 = np.sin(x)

In [36]: y_2 = np.cos(x)

In [37]: plt.plot(x, y_1)
Out[37]: [<matplotlib.lines.Line2D at 0x1121120b8>]

In [38]: plt.plot(x, y_2)
Out[38]: [<matplotlib.lines.Line2D at 0x1121157f0>]

In [39]: plt.grid()

In [40]: plt.xlabel('x')
Out[40]: Text(0.5,0,'x')

In [41]: plt.ylabel('y')
Out[41]: Text(0,0.5,'y')

In [42]: plt.show()

重ね合わせ