Pythonによるデータ分析をする際にグラフなどの可視化でよく利用されるmatplotlibで複数のグラフを一つのウィンドウに表示させる方法について解説します。
複数グラフを一つのウィンドウに表示する
matplotlibで一つのウィンドウに複数のグラフを表示し、比べたくなることがよくあります。本記事では、matplotlibで複数グラフを一つのウィンドウに表示する方法を例を使って紹介します。
シンプルな方法 ~ subplot ~
複数のグラフを一つのウィンドウに表示したい場合は、matplotlib.pyplotのsubplotメソッドを使用します。
以下にsin関数とcos関数を上下に表示する簡単な例を示します。
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 100) # 引数は、(行数, 列数, 指定する位置) plt.subplot(2, 1, 1) plt.plot(x, np.sin(x)) plt.subplot(2, 1, 2) plt.plot(x, np.cos(x)) plt.show()
x = np.linspace(0, 10, 100)の部分については、0~10の間を100個に分割した横軸の値を作成しています。
複数グラフを作成するには、plt.subplot(nrows, ncols, index)という形で、分割する行数(nrows)、列数(ncols)、位置の指定(index)を渡して実行します。
plt.subplot(2, 1, 1) plt.plot(x, np.sin(x))
上記はウィンドウを2行1列に分割した1番目のグラフということを指定しています。
位置の指定は分割された領域に数字が1, 2, …というように割り当てられていて、上から下、左から右の順に番号が付けられます。例えば、2×2の領域の場合であれば、左上(1)、右上(2)、左下(3)、右下(4)という形になります。
このように描画する位置を指定した後にplotメソッドで表示したいグラフを指定すると描画ができます。
plt.subplot(2, 1, 2) plt.plot(x, np.cos(x))
同じようにウィンドウを2行1列に分割した2番目のグラフを指定した後に描画することで複数のグラフを表示できるようになります。
subplotを使用することで、一つのウィンドウに複数のグラフを描画することができます。しかし、この方法は毎回描画する対象を引数で指定する必要があり少し扱いが面倒です。以降では、もう少しオブジェクト指向な考え方を適用した方法を紹介します。
オブジェクト指向な方法 ~ subplots ~
matplotlib.pyplotのsubplotsメソッドを使用してオブジェクト指向な考え方で、複数グラフを一つのウィンドウに表示する方法を紹介します。
以下にsin関数とcos関数を上下に表示する上記と同じ例での使い方を示します。
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 100) fig, ax = plt.subplots(2, 1) ax[0].plot(x, np.sin(x)) ax[1].plot(x, np.cos(x)) fig.show()
x = np.linspace(0, 10, 100)の部分については、0~10の間を100個に分割した横軸の値を作成しています。
複数のグラフを作成するには、plt.subplots(nrows, ncols)という形で、分割する行数(nrows)、列数(ncols)を指定します。
fig, ax = plt.subplots(2, 1)
上記の例では、2行1列の描画領域を用意している例です。返却値はfig, axのそれぞれに格納されます。
figはウィンドウ全体を表しているオブジェクトで、axはその中の分割された描画領域を表した配列(具体的にはnumpy.ndarray)となっています。
ax[0].plot(x, np.sin(x)) ax[1].plot(x, np.cos(x))
作成した領域に対してプロットする場合には、上記のようにaxに配列のようにアクセスしたうえでplotメソッドを呼び出せば描画ができます。
この方法は、axの添え字で各領域にアクセスできるので、例えばグラフを1番目のグラフに追加したい場合は、ax[0]にアクセスすることで対応することができます。
一つのウィンドウに複数のグラフを描画する場合、subplotメソッドの使用でもちろん問題はありませんが、何度もグラフを指定して描画を追記していく場合等のケースではsubplotsメソッドを使ってオブジェクトとして扱った方が扱いやすい可能性があります。
matplotlib.pyplot.subplotの公式ドキュメントはこちらを参照してください。
matplotlib.pyplot.subplotsの公式ドキュメントはこちらを参照してください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。