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)

Matplotlib 圖例 bbox_to_anchor 範例

若要更精細地控制位置,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=...) 留出空間,或選擇能容納座標軸與圖例的版面配置。上方範例圖顯示了放在外側的圖例;裁切結果圖則示範圖形沒有為圖例留空間時可能發生的情況。

Matplotlib 圖例 bbox_to_anchor 裁切結果

使用 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;標準輸出與錯誤輸出皆為空,因此沒有可顯示的輸出。