前回はグリッド線と軸の範囲を設定する方法を学びました。今回は1つのFigureに複数のAxesを並べる方法を見ていきましょう。
前回の記事はこちら(リンク)
目次
複数のAxesを並べるには
第3弾でadd_axes()を複数回呼ぶことで複数のAxesを置けると紹介しました。しかしあの方法は位置を手動で指定する必要があるため、均等に並べるのが大変です。
均等に複数のAxesを並べたいときはplt.subplots()を使うのが一般的です。
plt.subplots()を使う
plt.subplots()はFigureとAxesをまとめて作ってくれる便利な関数です。
fig, axes = plt.subplots(行数, 列数)
たとえば1行2列(横に2つ並べる)の場合はこうなります。
fig, axes = plt.subplots(1, 2)
Figure
┌─────────────┬─────────────┐
│ axes[0] │ axes[1] │
└─────────────┴─────────────┘
2行2列(2×2のグリッド)の場合はこうなります。
fig, axes = plt.subplots(2, 2)
Figure
┌─────────────┬─────────────┐
│ axes[0][0] │ axes[0][1] │
├─────────────┼─────────────┤
│ axes[1][0] │ axes[1][1] │
└─────────────┴─────────────┘
add_axes()との違い
add_axes() |
plt.subplots() |
|
|---|---|---|
| 位置の指定 | 手動(割合で指定) | 自動(均等に並ぶ) |
| 向いている場面 | グラフ内にミニグラフを埋め込むなど、不規則なレイアウト | 均等なグリッド配置 |
| 一般的か | あまり使わない | こちらが主流 |
実務やネット上のサンプルコードもほぼplt.subplots()で書かれています。迷ったらplt.subplots()を使うと覚えておけばOKです。add_axes()は特殊なレイアウトが必要なときだけ登場する、と思っておきましょう。
各Axesにグラフを描く
plt.subplots(1, 2)で作ったAxesはaxes[0]・axes[1]のようにインデックスでアクセスします。
axes[0].plot(x, np.sin(x)) # 左のAxesにsinを描く
axes[1].plot(x, np.cos(x)) # 右のAxesにcosを描く
これまでax.plot()・ax.set_title()と書いてきたaxが、axes[0]・axes[1]に変わっただけです。使えるメソッドはまったく同じです。
完成形:全部まとめて書く
sinとcosを左右に並べて表示してみましょう。
コードの量が少し多くなってきましたが、1行ずつ見ればきっと理解できるはずですよ!
import matplotlib.pyplot as plt
import numpy as np
# ① FigureとAxesをまとめて作る(1行2列)
fig, axes = plt.subplots(1, 2)
# ② データ作成
x = np.linspace(0, 10, 100)
# ③ 左のAxes(axes[0])にsinを描く
axes[0].plot(x, np.sin(x), color="blue")
axes[0].set_title("sin(x)")
axes[0].set_xlabel("x")
axes[0].set_ylabel("y")
axes[0].grid(True, linestyle="--", linewidth=0.5)
# ④ 右のAxes(axes[1])にcosを描く
axes[1].plot(x, np.cos(x), color="red")
axes[1].set_title("cos(x)")
axes[1].set_xlabel("x")
axes[1].set_ylabel("y")
axes[1].grid(True, linestyle="--", linewidth=0.5)
# ⑤ レイアウトを整える
fig.tight_layout()
# ⑥ 表示
plt.show()
表示結果
tight_layout()とは?
fig.tight_layout()はAxes同士が重ならないように余白を自動で調整してくれる関数です。複数のAxesを並べるときはほぼ必ずセットで使います。
呼ばなかった場合、タイトルや軸ラベルが隣のAxesと重なることがあるので、忘れずに書くようにしましょう。
今回追加した内容を整理するとこうなります:
| 内容 | コード |
|---|---|
| FigureとAxesをまとめて作る | fig, axes = plt.subplots(行数, 列数) |
| 各Axesにアクセスする |
axes[0], axes[1], ... |
| 余白を自動調整する | fig.tight_layout() |
まとめ
- 均等に複数のAxesを並べるには
plt.subplots(行数, 列数)を使う -
plt.subplots()はFigureとAxesをまとめて返してくれる - 各Axesへは
axes[0]・axes[1]のようにインデックスでアクセスする -
fig.tight_layout()で余白を自動調整するのを忘れずに
次回は棒グラフや散布図など、折れ線グラフ以外のグラフの種類を見ていきます!
