Matplotlib でグラフを描きます

≫ BlogCat は数学サイトも運営しています。
 

Advertisement

 

 

 

Matplotlib

 Matplotlib は現代的オブジェクト指向言語 Python のために開発されたオープンソースのグラフ描画用パッケージです。科学計算用ライブラリ NumPy および SciPyと併用することで、ユーザーのもつデータを様々な方法で可視化できるように設計されています。Matplotlib は学術・産業分野で定評のある有料ソフトウェア MATLAB とほぼ同等の機能をもち、かつ無料であることから、様々な研究分野で活用され始めています。

 Matplotlib の pyplot モジュールが提供するインターフェースは MATLAB をお手本に設計されています。そのため慣れないうちは、その作図コマンドの暗黙的動作に違和感を覚える Pythonユーザーもいるようです。しかし土台はあくまで Python なので、ユーザーは意識的にオブジェクト指向で明示的なコードを記述することもできます。

 当サイトでは基本姿勢として、Matplotlib の骨格である Figure と Axes の階層構造を明示したオブジェクト指向のサンプルコードを掲載します。この記述法は MATLABスタイルに比べると、コードが若干長くなりますが、暗黙的動作を排除することで「どの行のコードで何をしているのか」がわかりやすくなり、結果として「どこを変えればグラフを調整できるのか」ということが明確になります。
 

Matplotlib の基本的な使い方

 当サイトでは Jupyter Notebook 環境を前提に Matplotlib の使い方を解説しますが、マジックコマンドで呼び出さない記法を採用しているので、PyCharm など他の統合開発環境であっても使い方はほとんど同じです。

Figure と Axes

 Matplotlib を使ってグラフを描くときには、最初に NumPy と Matplotlib のサブパッケージである pyplot を読み込みんでから、FigureAxes を用意します。

# NumPyをインポート
import numpy as np

# matplotlibをインポート
import matplotlib.pyplot as plt

# Axes を配置する領域 (Figure) を作成
fig = plt.figure(facecolor = "lightgray")

# Figure に Axes を1つ追加
ax = fig.add_subplot(111)

 上のサンプルコードを実行すると、次のようなグラフが表示されます。[注:Jupyter Notebook を開いて一番最初にグラフを描画させようとすると、<Figure size 640x480 with 1 Axes> のような文だけが表示される場合がありますが、その場合には、もう一度実行するとグラフが描かれます]

 Matplotlibグラフ描画 Axesを追加

 灰色に塗り潰された領域が Figure, 内側の白い部分が Axes です。

 Matplotlibグラフ描画 AxesとFigure

 Figure はウィンドウのようなもので、この中にグラフを描画するための Axes を複数配置することができます。サンプルコードでは Figure の領域がわかりやすいように facecolor (塗り潰しの色) に lightgray (薄い灰色) を指定していますが、デフォルトだと真白なので、Jupyter Notebook の背景色と同化してしまって Figure の範囲がよくわかりません。ちなみに Axes とは「座標軸」を意味する Axis の複数形で、Matplotlib では「グラフ描画領域」という意味で使われています。

 Figure は Figureクラスのインスタンスで、普通は Figureオブジェクト (あるいは単に Figure) とよばれます。Axes は Axesクラスのインスタンスで、Axesオブジェクトまたは Axes とよばれます。詳細については、Matplotlib の公式ドキュメント を参照してください。

 上のコードでは、Axes は figure.add_subplot()メソッドによって追加されています。このことから、Axes のことをサブプロットとよぶ場合もあります。また、ここでは詳しく書きませんが、Axes は figure.add_axes()メソッドによって追加することもできます。どちらのメソッドを使っても、追加されるのは同じ Axesオブジェクトです。

 最後の行で pyplot.show()関数を使うとグラフが描画されます。
 

複数の Axes を配置します

 先ほどのサンプルコードで、figure.add_axes()メソッドの引数が「111」となっていましたが、これは「 Figure の 1 行 1 列の 1 番目に Axes を追加する」ことを意味しています。今度は 2 行 2 列の 1, 2, 3 番目に Axes を追加するコードを書いてみます。

# NumPyをインポート
import numpy as np

# matplotlibをインポート
import matplotlib.pyplot as plt

#Axesを描画する領域(Figure)を作成
fig = plt.figure(facecolor = "lightgray")

# Figureに3つのAxesを追加
ax_1 = fig.add_subplot(221)
ax_2 = fig.add_subplot(222)
ax_3 = fig.add_subplot(223)

 コードを実行すると次のようなグラフが表示されます。

 Matplotlibグラフ描画 Axesを複数配置

 figure.add_axes()メソッドの引数 22x を指定したときに追加される Axes の位置対応は次のようになっています。

 Matplotlibグラフ描画 Axesの位置対応図
 

1次関数のグラフを描きます

 Axes に 1 次関数(直線)のグラフをプロットしてみましょう。

# 1次関数のグラフの描画

# NumPyをインポート
import numpy as np

# matplotlibをインポート
import matplotlib.pyplot as plt

#サブプロットを描画する領域を作成
fig = plt.figure()

# figにAxesを1つ追加
ax = fig.add_subplot(111)

# -5~5まで0.1刻みの数値の配列を定義
x = np.arange(-5, 5, 0.1)

# グラフに描く関数
y = x

# axにグラフを描画
ax.plot(x, y)

 このコードを実行すると直線のグラフが表示されます。

 Python Matplotlibで描いた直線のグラフ

 上のコードでは、np.arange関数を使って -5 から 5 まで 0.1 刻みの数値を要素にもつ配列を定義したあと、y = x によって、x に等しい配列をもう1つ作成しています。そして、axes.plot()メソッドを使って、Axes にデータをプロットさせています。これは最低限の設定で描かせたグラフなので、グラフタイトルも軸ラベルもありません。そうした細かい部分の調整を各記事で解説していくことになります。