HOWTO · Matplotlib
Matplotlib でサブプロット間の間隔を変更する方法
tight_layout()、subplots_adjust()、subplot_tool()、または constrained_layout=True を使用して、サブプロットの多い Matplotlib 図の間隔を改善します。
このページの内容
多数のサブプロットを含む Matplotlib の図を読みやすくするには、作業の流れに合ったレイアウト調整方法を選びます。サブプロットの装飾を自動的に収めるには tight_layout()、間隔や図の余白を設定するには plt.subplots_adjust()、対話的に調整するには plt.subplot_tool()、サブプロットの作成時に自動レイアウトを有効にするには constrained_layout=True を使います。これらはレイアウトを調整する方法です。各 Axes にもっと広い領域が必要な場合は、図のサイズを大きくするか、行数や列数を変更することも検討してください。
tight_layout() でサブプロットの重なりを防ぐ
プロット、ラベル、タイトルを追加した後に fig.tight_layout() を呼び出します。軸ラベルやタイトルなどの装飾を収めるために、サブプロットの位置を調整します。既定の配置が窮屈な場合にまず試す方法として便利ですが、特に複雑な装飾を含む図では、あらゆるレイアウトの問題を解決できるとは限りません。
次の完全な例では、2 行 2 列のグリッドにタイトル付きのプロットを 4 つ作成し、自動調整を適用します。なお、変更されないコードが表示する各プロットのタイトルは英語(「Sine function」「Cosine function」など)です。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-3, 3, 100)
series = [
(np.sin(x), "Sine function"),
(np.cos(x), "Cosine function"),
(1 / (1 + np.exp(-x)), "Sigmoid function"),
(np.exp(x), "Exponential function"),
]
fig, axes = plt.subplots(2, 2)
for ax, (values, title) in zip(axes.flat, series):
ax.plot(x, values)
ax.set_title(title)
fig.tight_layout()
plt.show()
この例は、NumPy と Matplotlib をインストールした Python 環境で実行してください。タイトルとプロットするデータを追加した後に、レイアウトを調整します。
plt.subplots_adjust() でサブプロットの間隔と余白を設定する
Axes 間の間隔や、グリッドの周囲の余白を直接調整したい場合は、plt.subplots_adjust() を使います。wspace は平均 Axes 幅に対する割合として水平方向の間隔を設定し、hspace は平均 Axes 高さに対する割合として垂直方向の間隔を設定します。left、right、bottom、top は、図の幅または高さに対する割合でサブプロット領域の端を指定します。
次の例では、同じ 4 つのプロットの配置を使い、行間を広くしています。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-3, 3, 100)
series = [
(np.sin(x), "Sine function"),
(np.cos(x), "Cosine function"),
(1 / (1 + np.exp(-x)), "Sigmoid function"),
(np.exp(x), "Exponential function"),
]
fig, axes = plt.subplots(2, 2)
for ax, (values, title) in zip(axes.flat, series):
ax.plot(x, values)
ax.set_title(title)
fig.subplots_adjust(left=0.12, right=0.95, bottom=0.12, top=0.9, wspace=0.25, hspace=0.4)
plt.show()
対応する間隔を広げるには、wspace または hspace の値を大きくします。4 つの端の値を調整すると、たとえばラベル用のスペースがもっと必要な場合に、サブプロットのグリッド周囲に余白を確保できます。これらの設定は図の中で Axes を配置するものです。図全体を広くするには、plt.subplots() の figsize を変更してください。
plt.subplot_tool() でサブプロットのレイアウトを対話的に調整する
plt.subplot_tool() は、サブプロットの間隔や余白を調整するコントロールを備えた Matplotlib のウィンドウを開きます。図を見ながら調整し、選んだ設定をスクリプトに反映したい場合に便利です。このツールには、対話型の Matplotlib バックエンドとグラフィカル環境が必要です。静的な画像や、画面表示を伴わない描画セッションのレイアウト調整には使えません。
GUI を使う対話型セッションでは、図を作成し、その図を引数にして plt.subplot_tool(fig) を呼び出します。この呼び出しには、ツールバーが関連付けられた Matplotlib キャンバスマネージャーが必要です。画面表示を伴わない描画に使われるような非対話型バックエンドには、そのツールバーがないため、ツールを起動できません。この対話型の例は、画面表示を伴わない環境で実行できるスクリプトとしては示していません。
図を見ながらツールのコントロールでサブプロットのパラメーターを変更します。配置が決まったら、対応する wspace、hspace、余白の値をコード内で plt.subplots_adjust() に設定すると、同じ出力を再現できます。
サブプロットの作成時に constrained_layout=True を有効にする
描画時に図の余白を自動調整したい場合は、plt.subplots() の呼び出し時に constrained_layout=True を渡します。レイアウトエンジンは、タイトルやラベルなどのサブプロットの装飾を考慮します。図の作成時に有効にしてください。描画に合わせてレイアウトを調整する機能ですが、複雑な装飾には手動調整が必要な場合もあります。詳しくは Matplotlib の constrained layout ガイドを参照してください。
import numpy as np
import matplotlib.pyplot as plt
a = np.linspace(0, 5, 100)
figure, axes = plt.subplots(2, 2, constrained_layout=True)
axes[0, 0].plot(a, np.exp(a))
axes[0, 1].plot(a, np.sin(a))
axes[1, 0].plot(a, np.cos(a))
axes[1, 1].plot(a, a ** 2)
for index, ax in enumerate(axes.flat, start=1):
ax.set_title(f"Subplot {index}")
plt.show()
4 つの方法はいずれもサブプロットのレイアウト管理に役立ちますが、適した作業の流れは異なります。コンテンツを追加した後に手早く自動調整するには tight_layout()、値を明示的に指定するには plt.subplots_adjust()、対話的に調整するには plt.subplot_tool()、図の作成時に間隔を自動管理させるには constrained_layout=True を使います。