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。這些控制方式會調整版面;如果每個座標軸需要更多空間,也可以考慮放大圖形,或調整列數與欄數。
使用 tight_layout() 避免子圖重疊
加入繪圖、標籤和標題後,呼叫 fig.tight_layout()。它會調整子圖的位置,為座標軸標籤、標題等裝飾留出空間。當預設版面顯得擁擠時,這是很適合優先嘗試的方法;不過,它未必能解決所有版面問題,尤其是圖形包含複雜裝飾時。
以下完整範例會在 2×2 網格中建立四個帶標題的繪圖,接著套用自動調整。請注意,未修改的範例會以英文顯示繪圖標題,例如 “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() 設定子圖間距與邊界
若要直接控制座標軸之間的間隔或子圖網格周圍的空間,請使用 plt.subplots_adjust()。wspace 會將水平間距設為平均座標軸寬度的比例;hspace 則會將垂直間距設為平均座標軸高度的比例。left、right、bottom 和 top 的值會以圖形寬度或高度的比例設定子圖區域邊界。
以下範例沿用相同的四個繪圖配置,並加大各列之間的間距:
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,即可加寬相應方向的間距。調整四個邊界值,可在子圖網格周圍預留更多空間,例如為標籤留出位置。這些設定會控制圖形內的座標軸版面;如果整個圖形都需要更多空間,請修改 plt.subplots() 中的 figsize。
使用 plt.subplot_tool() 互動調整子圖版面
plt.subplot_tool() 會開啟 Matplotlib 視窗,提供調整子圖間距和邊界的控制項。如果你想透過視覺方式微調圖形,再將選定的設定套用到程式中,這個工具就很實用。它需要互動式 Matplotlib 後端和圖形介面環境;無法用來調整靜態圖片或在無頭模式下執行的繪圖工作階段。
在具有圖形介面的互動式工作階段中,先建立圖形,再將該圖形傳入 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()
這四種方法都能協助管理子圖版面,但適用的工作流程各不相同:加入內容後要快速自動調整,可使用 tight_layout();要明確設定數值,可使用 plt.subplots_adjust();要互動微調,可使用 plt.subplot_tool();建立圖形時若希望自動處理間距,則可啟用 constrained_layout=True。