HOWTO · Matplotlib

如何在 Matplotlib 中指定图形坐标中的图例位置

本文向大家介绍如何在 Matplotlib 中指定图例在图形中的位置。

本页内容

若要设置 Matplotlib 图例的位置,可将 loc 参数设为标准位置,例如 "upper left" 或 "lower right"。若要将图例放在特定坐标处,可结合使用 loc 和 bbox_to_anchor:bbox_to_anchor 提供锚点坐标,loc 则选择要与锚点对齐的图例位置。Matplotlib 默认的 borderaxespad 会留出一小段间距,因此图例上可见的对齐点可能稍微偏离该坐标;若需要精确对齐,请设置 borderaxespad=0。

示例:使用 loc 和 bbox_to_anchor 定位 Matplotlib 图例

下面的示例创建两个坐标轴,并分别为它们添加图例。第一个坐标轴使用 best,第二个使用 lower left。你可以更改这些值,比较它们在自己绘制的数据上的标准位置效果。图中展示绘图结果,代码则标明可以调整哪些设置。

import matplotlib.pyplot as plt

x = [1, 2, 3]
y1 = [0.5 * i + 1 for i in x]
y2 = [2 * i + 1 for i in x]

fig, ax = plt.subplots(2, 1)

ax[0].plot(x, y1, "b-", label="0.5x+1")
ax[0].plot(x, y2, "g-", label="2x+1")
ax[0].legend(loc="best")

ax[1].plot(x, y1, "b-", label="0.5x+1")
ax[1].plot(x, y2, "g-", label="2x+1")
ax[1].legend(loc="lower left")

plt.tight_layout()
plt.show()

Specify Legend position in graph coordinates Matplotlib

loc 参数接受以下值:best、upper right、upper left、lower left、lower right、right、center left、center right、lower center、upper center 和 center。这些是 Matplotlib 接受的原始选项值,因此表格中保留英文:

best
upper right
upper left
lower left
lower right
right
center left
center right
lower center
upper center
center

使用标准位置时,loc 会在所属坐标轴内定位图例。设为 best 时,Matplotlib 会根据绘图内容选择位置;lower left 等命名值则让你直接指定位置。如果图例遮住了重要的线条或标记,可以尝试列表中的其他值。这些选项表示图例相对于所属坐标轴的位置,而非相对于整个图形的共同位置。

若要按坐标定位,bbox_to_anchor 提供锚点坐标,loc 则选择与该锚点对齐的图例位置。下一个示例中的每个锚点都使用各自坐标轴的相对坐标。红色标记通过 ax.transAxes 绘制在同一坐标处,方便辨认锚点。两个坐标轴使用不同的 loc 值,展示所选图例位置如何变化。使用默认的 borderaxespad 时,图例与各自的标记之间会有一小段间距;标记仍然指出锚点坐标。

import matplotlib.pyplot as plt

x = [1, 2, 3]
y1 = [0.5 * i + 1 for i in x]
y2 = [2 * i + 1 for i in x]

fig, ax = plt.subplots(2, 1)

ax[0].plot(x, y1, "b-", label="Plot-1")
ax[0].plot(x, y2, "g-", label="Plot-2")
ax[0].legend(loc="upper left", bbox_to_anchor=(0.9, 0.75))
ax[0].scatter((0.9), (0.75), s=70, c="red", transform=ax[0].transAxes)

ax[1].plot(x, y1, "b-", label="Plot-1")
ax[1].plot(x, y2, "g-", label="Plot-2")
ax[1].legend(loc="center right", bbox_to_anchor=(0.6, 0.4))
ax[1].scatter((0.6), (0.4), s=70, c="red", transform=ax[1].transAxes)

plt.tight_layout()
plt.show()

Set bbox_to_anchor to specify Legend position in graph coordinates Matplotlib

在上方的坐标轴中,bbox_to_anchor=(0.9, 0.75) 将锚点设在红色标记处。由于 loc="upper left",图例的左上角会与该锚点对齐;默认的 borderaxespad 会留下一小段可见间距。在下方的坐标轴中,锚点为 (0.6, 0.4),且 loc="center right",因此图例的右侧中点会以相同的间距效果与下方红色标记对齐。若要让任一所选位置与标记完全重合,请在该坐标轴的 legend 调用中加入 borderaxespad=0。

若要调整任一位置,先选择相对于对应坐标轴的 x、y 坐标,再设置相应的 bbox_to_anchor 元组,并在调整绘图时标出该坐标。然后选择一个 loc 值,指定要与锚点对齐的图例位置。这两个设置会共同决定位置:只改变锚点会移动所选的图例位置;改变 loc 则会改变图例的哪个位置与锚点对齐。每个标记的变换应与其图例绑定到同一坐标轴,以确保视觉参照使用相同的坐标空间。保留默认的 borderaxespad 可留出小间距;在 legend 调用中设为 borderaxespad=0 则可让标记与所选图例位置精确对齐。文中未展示控制台输出;上方图片展示了绘图结果。