▶ matplotlibによる可視化を基本から解説しています。以下の投稿も合わせてご覧ください。
はじめに
今回は複数のグラフを並べて描く方法を基本から解説します。グラフを重ねて描くこともありますが、並べて比較したいときもありますね。いくつかのやり方があるうえに、使用するメソッド名も似ているので混乱することもあると思います。今回はこれらを整理しましょう。
複数のグラフを並べて描く
plt.subplot()を使う
まず最初はplt.subplot()を使うやり方です。はじめに書式を確認しておきましょう。
nrows, ncolsでグラフの領域を何行・何列でいくつか作るかを指定します。その後に、実際に描画するのはその何番目の領域にするかを指定します。
やってみましょう。
# ライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt
# 複数のグラフを並べて描く
x = np.linspace(-10,10,100)
plt.subplot(1,3,1)
plt.plot(x,x)
plt.subplot(1,3,2)
plt.plot(x, x**2)
plt.subplot(1,3,3)
plt.plot(x, x**3)
plt.subplot(1,3,1)は、nrows=1, ncols=3, index=1であり、1行3列の領域の1番目を表します。indexの部分はわかりにくいのですが、(0番目からではなく)1から数えます。このように領域をしていてしてから、plt.plot()でプロットします。
同様にplt.subplot(1,3,2)は、1行列の領域の2番目を表します。以下、同様です。わかりやすいですね。
add_subplot()を使う
figオブジェクトを作成( plt.figure() )して、そこにaxのオブジェクトを加えていく( add_subplot() )というやり方です。次のような手順になります。
確認していきましょう。
fig = plt.figure(figsize=(12,4))
ax1 = fig.add_subplot(1,3,1)
ax1.plot(x,x)
ax2 = fig.add_subplot(1,3,2)
ax2.plot(x, x**2)
ax3 = fig.add_subplot(1,3,3)
ax3.plot(x, x**3)
さっきと似ているので簡単ですね。figオブジェクトを先に作っておいて、そのfigに対してadd_subplot()の操作でaxオブジェクトを作っています。
plt.subplots()を使う
最後にplt.subplots()です。複数形となるので注意してください。これはfigオブジェクトとaxオブジェクトを同時に作るやり方です。
nrows, ncolsで何行何列の領域にするかを決めます。defaultではnrows=1, ncols=1となっており1行1列の領域となります。試してみましょう。
# fig, axesオブジェクトを作る
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(12,4))
# 描画する
axes[0].plot(x, x)
axes[1].plot(x, x**2)
axes[2].plot(x, x**3)
plt.subplots(nrows=1, ncols=3)で1行3列の領域を作っています。領域の場所は0から番号が振られているので、axes[0]は1行1列、axes[1]は1行2列、asex[2]は1行3列の領域を表します。
次に、行方向を増やしてみましょう。
# fig, axesオブジェクトを作る
fig, axes = plt.subplots(nrows=2, ncols=3,figsize=(12,4))
# 描画する
axes[0].plot(x, x)
axes[1].plot(x, x**2)
axes[2].plot(x, x**3)
エラーが出てしまいました。行または列の一方が1である場合は、先頭から順番にインデックスが割り振られるのですが、今回のような場合は行番号・列番号を指定する必要があります。次のようにします。
# fig, axesオブジェクトを作る
fig, axes = plt.subplots(nrows=2, ncols=3,figsize=(12,4))
# 描画する
axes[0,1].plot(x, x)
axes[1,1].plot(x, x**2)
axes[1,2].plot(x, x**3)
今度はうまくいきました。行番号・列番号ではなく通し番号で指定したい場合は次のようにすることもできます。
# fig, axesオブジェクトを作る
fig, axes = plt.subplots(nrows=2, ncols=3,figsize=(12,4))
axes = axes.flatten()
# 描画する
axes[0].plot(x, x)
axes[1].plot(x, x**2)
axes[5].plot(x, x**3)
まとめ
今回は複数のグラフを並べて描く方法を解説しました。まとめて学んでおいた方が混乱しないですね。私は、それぞれの方法を別々の機会で学んだので混乱してました。
しっかり復習して使いこなせるようにしておきましょう。
コメント