HOWTO · Matplotlib
如何在 Matplotlib 中將圖例放在繪圖區域外
了解如何將 Matplotlib 圖例放在座標軸外,並避免儲存圖形時遭到裁切。
本頁內容
使用 bbox_to_anchor 搭配 loc,即可將 Matplotlib 圖例放在座標軸外。例如,ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) 會將圖例的左上角錨定在座標軸右上邊緣之外。預設的座標軸座標系中,(0, 0) 是左下角,(1, 1) 則是右上角。
bbox_to_anchor 範例
使用兩個值的 bbox_to_anchor,可以把圖例放在座標軸外側。對 Axes.legend 而言,這一組數值是在座標軸座標系中的錨點;loc 會將圖例對應的角對齊該錨點。以下完整範例繪製兩條帶有標籤的曲線,並為圖例預留圖形空間。
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))
fig.subplots_adjust(right=0.78)
plt.close(fig)
若要更精細地控制位置,bbox_to_anchor 也接受 (x0, y0, width, height)。這四個值定義的是錨定框,而不是圖例的尺寸:(x0, y0) 是錨定框的左下角,width 和 height 則以座標軸座標表示框的寬與高。loc 用來選擇圖例上的哪個位置,並將它對齊錨定框上相對應的位置。例如,loc="upper left" 會讓圖例左上角對齊錨定框左上角。常見的字串值有 "upper right"、"lower left"、"center" 和 "best";Matplotlib 也接受對應的數字代碼,從 0("best")到 10("center")。
tight_layout() 會調整子圖參數,為座標軸標籤、標題等裝飾元素騰出空間。但在各種版面配置中,它不一定能替座標軸外的圖例預留足夠空間。若要讓圖例在視窗中完整顯示,請使用 fig.subplots_adjust(right=...) 留出空間,或選擇能容納座標軸與圖例的版面配置。上方範例圖顯示了放在外側的圖例;裁切結果圖則示範圖形沒有為圖例留空間時可能發生的情況。
使用 bbox_extra_artists 和 bbox_inches 避免圖例遭到裁切
儲存圖形時,將外置圖例傳給 bbox_extra_artists,並設定 bbox_inches="tight"。如此一來,儲存操作會在計算圖形的緊密邊界框時納入圖例,匯出的圖片便會包含圖例。以下範例已成功執行,並將 PNG 檔案寫入暫存目錄;標準輸出與錯誤輸出皆為空。
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
from tempfile import TemporaryDirectory
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
legend = ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))
with TemporaryDirectory() as directory:
output_path = Path(directory) / "example.png"
fig.savefig(
output_path,
dpi=300,
format="png",
bbox_extra_artists=(legend,),
bbox_inches="tight",
)
plt.close(fig)
bbox_extra_artists 接受要納入緊密邊界框計算的 Artist 物件。bbox_inches="tight" 則要求 savefig 使用計算出的邊界框來儲存圖片。這些設定可避免匯出時裁切圖例,但不會調整圖例在座標軸內的位置或大小。
儲存範例執行成功,結束代碼為 0;標準輸出與錯誤輸出皆為空,因此沒有可顯示的輸出。