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]: <matplotlib.text.Text at 0x110616f28>

In [11]: plt.xlabel('X') # X軸のラベル
Out[11]: <matplotlib.text.Text at 0x1105efba8>

In [12]: plt.ylabel('y') # y軸のラベル
Out[12]: <matplotlib.text.Text at 0x1105fba90>

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

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]: <matplotlib.text.Text at 0x110950128>

In [19]: plt.ylabel('y') 
Out[19]: <matplotlib.text.Text at 0x110953fd0>

In [20]: plt.title('limited scale')
Out[20]: <matplotlib.text.Text at 0x110d7a668>

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]: <matplotlib.text.Text at 0x11142f128>

In [26]: plt.xlabel('x') 
Out[26]: <matplotlib.text.Text at 0x110dfd8d0>

In [27]: plt.ylabel('y') 
Out[27]: <matplotlib.text.Text at 0x110e067b8>

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]: <matplotlib.text.Text at 0x110da5940>

In [32]: plt.ylabel('frequency') 
Out[32]: <matplotlib.text.Text at 0x110da5f60>

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]: <matplotlib.text.Text at 0x111e83b38>

In [41]: plt.ylabel('y') 
Out[41]: <matplotlib.text.Text at 0x111e92a20>

In [42]: plt.show() 

重ね合わせ