前回までの講座でplt.plot()を使って、綺麗なグラフを描写できるようになったと思います。
そこで次にやりたくなるのが複数のグラフをplotする事ですね!
実際の現場では、ひとつのグラフしか表示しないという事は少ないです。
複数のグラフをplotして、比較することが多いので、その方法を学んでいきましょう!
複数のグラフを作成する方法として、今回は以下の方法を紹介します。
- plt.subplot()
- plt.figure()
- plt.subplots()
それぞれで作り方が異なります。
どれも簡単に作成することができますので、サクッとやっていきましょう。
plt.subplot()で複数のグラフを作成
plt.subplot()に基本的な使い方は↓です。
- plt.subplot(行数指定、列数指定、何個目にplotするか?)
このようにして使います。
ではシンプルに1行2列の表を作ってみます。(matplotlibのインポートを忘れないように)
1 2 3 4 5 6 7 |
x = np.linspace(-20,20,100) plt.subplot(1, 2, 1) plt.plot(x, x**2) plt.subplot(1, 2, 2) plt.plot(x, x**3) |
無事2つのグラフを作成することができましたね!
流れとしては、
- plt.subplot()でグラフの場所を指定
- plt.plot()でplot
- plt.subplot()でグラフの場所を指定
- plt.plot()でplot
- この流れを続ける
このようにしていくだけですのでシンプルですね!
それぞれのグラフのオプション設定
複数のグラフをplotしても、それぞれの色やマーカー、ラベルなどの付帯情報の設定を変えることができます。
1 2 3 4 5 6 7 8 9 10 11 12 |
x = np.linspace(-20,20,100) plt.subplot(1, 2, 1) plt.plot(x, x**2, color='red') plt.title('x**2') plt.subplot(1, 2, 2) plt.plot(x, x**3, label='blue') plt.title('x**3') plt.legend(loc=4) |
plt.tight_layout()で位置を良い感じに
2つのグラフをplotできましたね!
しかしよく見ると、2つのグラフの距離が近くて、2個目のグラフのy軸の目盛りが1個目のグラフに重なってしまっています。
これでは美しくありませんね~!
こんな時はplt.tight_layout()を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
x = np.linspace(-20,20,100) plt.subplot(1, 2, 1) plt.plot(x, x**2, color='red') plt.title('x**2') plt.subplot(1, 2, 2) plt.plot(x, x**3, label='blue') plt.title('x**3') plt.legend(loc=4) # 位置を調整 plt.tight_layout() plt.show() |
良い感じになりました!
plt.tight_layout()をするだけで、良い感じに調節してくれます。
plt.subplots_adjust()メソッドを使うことで、細かく位置調整をすることもできますが、正直これだけで十分だと思います。
グラフを縦に並べる
グラフを横だけでなく、縦に並べることもできます。
plt.subplot()の行列の指定を変えるだけですので簡単です。
1 2 3 4 5 6 7 |
x = np.linspace(-20,20,100) plt.subplot(2, 1, 1) plt.plot(x, x**2) plt.subplot(2, 1, 2) plt.plot(x, x**3) |
plt.figure()で複数のグラフを作成
plt.figure()を使いますが、そもそもオブジェクト指向とは何か分かるでしょうか?
オブジェクト指向とは?
オブジェクト指向を理解する上で大事な用語として以下の3つがあります。
- オブジェクト
- クラス
- インスタンス
クラスは聞いたことがあるって人も多いと思います。
pythonの基礎で必ず出てくる単語ですからね!
まずは概念を理解しましょう。
例えば、家を建てるときを想像してください。
家を建てる時は設計図をもとに建てますよね?
この設計図はクラスに相当し、家がインスタンスに相当します。
Pythonのオブジェクト指向では、クラスを定義することで、そのクラスから複数のインスタンスを生成することができます。
plt.figureの場合は、plt.figureがクラスで、figureオブジェクトを作るための設計図があります。
そして、この設計図を元にして作った、figがインスタンスであり、figureオブジェクトであるのです。
正直初見で理解するのは難しいですね~。
オブジェクト指向など難しい言葉を使いましたが、まずはクラスからインスタンスを作るというのだけ理解出来れば大丈夫です。
では実際にやってみましょう。
まずやるのはfigureクラスからfigインスタンスを作ります。
1 2 |
# figインスタンスの生成 fig = plt.figure() |
はい、これだけです。
そして、このfigインスタンスを基に複数のグラフを作成していきます。
その時に使うのがadd_subplot()で、subplot()と同じ引数の指定方法で大丈夫です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
x = np.linspace(-20,20,100) # figインスタンスの生成 fig = plt.figure() # 作成するグラフの数を指定 axes1 = fig.add_subplot(1, 2, 1) axes2 = fig.add_subplot(1, 2, 2) # グラフをplot axes1.plot(x, x**2) axes2.plot(x, x**3) # グラフの配置を調整 plt.tight_layout() |
これで2つのグラフが作成できました。
ただplt.figure()を使うことはそんな多くないと思います。
このやり方だと、figを作ってからaxesを作るという2度手間になってしまうためです。
その点次に紹介する方法だと1発で作成することが出来るので簡単です。
plt.subplots()で複数のグラフを作成
その方法がplt.subplots()です。
一番初めに紹介したplt.subplot()とはsがあるかないかの違いですが、別物になるので注意してください。
一般的な書き方として、
- fig, axes = plt.subplots(行, 列)
このような書き方が主流です。(axesをaxとする人も多いです)
ちなみに意味としては↓になります。
- figure=形
- axes=軸
plt.subplots()の使い方
では実際に複数のグラフを作成してみましょう。
まずはシンプルに1行2列です。
1 |
fig, axes = plt.subplots(1, 2) |
この結果、figとaxesができました!
それぞれの中身を見ていきます。
1 |
fig |
figの方には、中身が空の1行2列のfigureが入っています。
続いてaxesです。
1 |
axes |
axesインスタンスにはaxesオブジェクトがarrayになって入っているのが分かりました。
この後の流れとしては、このaxesオブジェクトに対してplot()で描写してあげれば良いだけです。
それぞれのaxesオブジェクトは[0]や[1]など、indexで指定してあげましょう!
1 2 3 4 5 6 7 8 9 10 |
x = np.linspace(-20,20,100) fig, axes = plt.subplots(1, 2) axes[0].plot(x, x**2) axes[1].plot(x, x**3) # グラフの配置を調整 plt.tight_layout() |
無事作成することができました。
plt.figure()と同じグラフをplotしていますが、コチラのやり方の方が少ない行数で作成することが出来ましたね。
plt.subplots()でグラフの調整
plt.subplots()の場合は、マーカーやカラーなどに関してはplt.subplot(x, y, color=’red’, marker=’o’)などと、今まで通り引数に指定して大丈夫です。
ただ、ラベルや目盛り設定などは、
- axes[index指定].set_xlabel(‘ラベル名’)
- axes[index指定].set_xticks(目盛り指定)
- axes[index指定].set_xlim(表示範囲指定)
このように、set_~~()の形で指定する点だけは今までと違います。
また、表の配置を良い感じにしてくれるtight_layout()ですが、これはplt.suplots()の引数に指定して、まとめることも可能です。
- plt.subplots(1,2, tight_layout=True)
では実際に作成してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
x = np.linspace(-20,20,20) fig, axes = plt.subplots(1, 2, tight_layout=True) axes[0].plot(x, x**2, color='red', label='red') axes[1].plot(x, x**3, marker='o', label='blue') axes[0].set_xlabel('x**2') axes[0].legend(loc=4) axes[1].set_xlabel('x**3') axes[1].set_xlim(-15, 15) axes[1].legend(loc=4) |
また、figure全体のタイトルを付ける事もできます。
fig.suptitle(‘タイトル名’)で指定すればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 |
x = np.linspace(-20,20,20) fig, axes = plt.subplots(1, 2, tight_layout=True) fig.suptitle('title') # figureのタイトル fig.suptitle('title') axes[0].plot(x, x**2) axes[1].plot(x, x**3) axes[0].set_xlabel('x**2') axes[1].set_xlabel('x**3') |
2行以上のグラフを作成する方法
注意点として、2行以上のグラフを作成する場合のindex指定の方法に注意しましょう。
例えば、2行3列で合計6個作りたい場合は、順番にaxex[1~6]と指定する事は出来ません。
axesは多次元arrayになっているので、axes[行数指定, 列数指定]の方法で指定します。
1 2 3 4 5 6 7 8 9 10 |
x = np.linspace(-20, 20, 20) fig, axes = plt.subplots(2, 3, tight_layout=True) axes[0,0].plot(x, x**2) axes[0,1].plot(x, x**2) axes[0,2].plot(x, x**2) axes[1,0].plot(x, x**3) axes[1,1].plot(x, x**3) axes[1,2].plot(x, x**3) |
このように指定する事で、複数行の場合でも対応することができます。
まとめ
複数のグラフをplotする方法を紹介しました。
覚えることが増えてきましたが、基本を理解していればそれぞれを組み合わせることで簡単にplotすることが出来ると思います。
今回は3つの方法で複数のグラフをplotする方法を紹介しました。
その中でも重要度が高いのがplt.subplots()です。
これだけ覚えておけば十分ですので、しっかりと身につけましょう。
Work illustrations by Storyset