Pythonでグラフを描くときは、Matplotlib
を使うことが多いですね。
Matplotlib
で一つの図の中に複数のグラフを並べるにはどうすればいいの?subplot
でグラフを並べられるらしいけど、使い方がよくわからない…。
という方のために、
plt.subplot()
の基本的な使い方|縦・横に並べる例- 【応用編】異なるサイズのグラフを並べる方法
を画像付きで解説していきます!
plt.subplot()
でプロットをキレイに配置して、見やすく人に伝わるグラフを目指しましょう!
plt.subplot()の概要
plt.subplot()
を使うと、一つの図の中に複数の小さなプロット(サブプロット)を配置することができます。
この例では、一つの図の中に、コンター(左側)と、曲線(右側)を出力しています。
仮にJupyter Notebookでplt.subplot()
を使用しないと、次のように縦にズラーっと並びます。
plt.subplot()
を使うのと使わないのと、どちらが見やすいかは一目瞭然ですね!
plt.subplot()使用の流れ
plt.subplot()
では、次のステップを繰り返して、一つの図の中にグラフを追加していきます。
plt.subplot()
でグラフを描く場所を指定plt.plot()
などでグラフを作成plt.subplot()
で別の場所を指定- 次のグラフを作成…(以後、繰り返し)
場所の指定、グラフの作成について、詳しく見ていきましょう。
subplot()でグラフを描く場所の指定
グラフを描く場所を指定するには、plt.subplot()
の引数に3つの整数LMN
を渡します。
import matplotlib.pyplot as plt
plt.subplot(LMN)
こうすると、
L
,M
,N
:それぞれ一桁の正数- 図を縦に
L
個、横にM
個に分割 - 左上から数えて
N
番目の領域を指定
となります。
例えば、縦に2分割(L = 2
)、横に3分割(M = 3
)した場合の、各サブプロットの場所は下図のようになります。
例えば、
plt.subplot(231)
⇒ 左上を指定plt.subplot(236)
⇒ 右下を指定
ということになります。
指定場所にプロット作成
plt.subplot()
で場所を指定後に、plt
の各種メソッドでグラフを作成します。
各種グラフの作成方法については、以下の記事を参考にしてください。
- 折れ線グラフ:
plt.plot()
- 円グラフ:
plt.pie()
- 棒グラフ:
plt.bar()
- 散布図:
plt.scatter()
以下では、plt.subplot()
の具体的な使用例を紹介していきます。
subplot()の使用例
次のサンプルデータをもとに使用例を紹介します。
import numpy as np
x = np.linspace(0, 3*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
横軸はNumPy
のlinspace()
で [0, 3π] を100等分した数列 x
です。
縦軸は y1 = sin(x)
, y2 = cos(x)
とします。
np.linspace()
の詳細は、次の記事を参考にしてください。
例1)グラフを縦に並べる
縦にグラフを2つ並べる例を紹介します。
plt.subplot(LMN)
で、縦に2分割(L = 2
)、横に1分割(M = 1
)plt.subplot(211)
で、上のグラフの位置指定plt.subplot(212)
で、下のグラフの位置指定
とする点がポイントです。
# 図のサイズを決める
plt.figure(figsize=(5,5))
# 1つ目のグラフ
plt.subplot(211)
plt.plot(x, y1)
# 2つ目のグラフ
plt.subplot(212)
plt.plot(x, y2, 'r--')
出力結果はこちらです。1つの図の中にグラフが縦に2つ並んでいます。
例2)グラフを横に並べる
横にグラフを2つ並べる例を紹介します。
plt.subplot(LMN)
で、縦に1分割(L = 1
)、横に2分割(M = 2
)plt.subplot(121)
で、左のグラフの位置指定plt.subplot(122)
で、右のグラフの位置指定
とする点がポイントです。
# 図のサイズを決める
plt.figure(figsize=(5,5))
# 1つ目のグラフ
plt.subplot(121)
plt.plot(x, y1)
# 2つ目のグラフ
plt.subplot(122)
plt.plot(x, y2, 'r--')
出力結果はこちらです。1つの図の中にグラフが縦に2つ並んでいます。
例3)グラフを縦横に並べる
縦横にグラフを2×2で並べる例を紹介します。
plt.subplot(LMN)
で、縦に2分割(L = 2
)、横に2分割(M = 2
)plt.subplot(221)
で、左上指定plt.subplot(222)
で、右上指定plt.subplot(223)
で、左下指定plt.subplot(224)
で、右下指定
とする点がポイントです。
# 縦横に並べる
plt.figure(figsize=(12,5))
# 左上のグラフ
plt.subplot(221)
plt.plot(x, y1)
# 右上のグラフ
plt.subplot(222)
plt.plot(x, y2, 'r--')
# 左下のグラフ
plt.subplot(223)
plt.plot(x, y1**2, "g.")
# 右下のグラフ
plt.subplot(224)
plt.plot(x, y2**2, 'c-.')
出力結果はこちらです。1つの図の中にグラフが縦に2つ並んでいます。
【応用編】異なるサイズのグラフを並べる
plt.subplot()
の領域指定を工夫すると、サイズの異なるグラフを一つの図の中に表示することもできます。
# 標準正規分布を計算する関数
def f_norm(x):
return 1/np.sqrt(2*np.pi)*np.exp(-0.5*x**2)
# xとyの値を準備
x = np.linspace(-2, 2, 100)
y = np.linspace(-2, 2, 100)
# z は正規分布の積
z = np.tensordot( f_norm(x), f_norm(y), axes=0)
# 左半分にコンター
plt.figure(figsize=(10,5))
plt.subplot(121)
plt.contourf(x,y,z)
# 右半分にプロット
plt.subplot(322)
plt.plot(y,z[30,:], "--")
plt.ylim(0,0.2)
plt.subplot(324)
plt.plot(y,z[50,:], "r")
plt.ylim(0,0.2)
plt.subplot(326)
plt.plot(y,z[90,:], "c-.")
plt.ylim(0,0.2)
出力結果はこちらです。
ポイントになるのはのplt.subplot()
の領域指定方法です。
plt.subplot(121)
で、図の左半分を指定plt.subplot(322)
で、図の右上を指定plt.subplot(324)
で、図の右中央を指定plt.subplot(326)
で、図の右下を指定
下図のように、領域が重ならないようにplt.subplot()
の位置指定をしています。
使用済みの領域を指定すると、先に描いていたグラフは表示されないという点に注意しましょう。
上の例ではコンターで使用済み領域(321)
、(323)
、(325)
に、後からグラフを追加してしまうと、コンターは表示されなくなります。
まとめ
plt.subplot()
を用いて、一つの図の中に複数のグラフを並べる方法を紹介しました。
plt.subplot()
でグラフを追加する場所を指定plt.plot()
などでグラフを作成
を繰り返すという点がポイントです!
plt.subplot()
をマスターして、キャッチーな伝わるグラフを目指しましょう!
もっとMatplotlib
を自由自在に操作したい!という方へのおススメコンテンツはこちらです!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!