You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib中如何解决左侧Axes图例被右侧Axes遮挡的问题?

Matplotlib左侧子图图例被右侧子图遮挡的解决方法

在Matplotlib 3.1.3环境中,当为相邻子图设置外置图例时,左侧子图的图例会被右侧子图遮挡,即便修改图例的zorder和clip_on属性也无法解决,但右侧子图的图例却能默认显示在左侧子图之上。示例代码及效果如下:

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot([0, 1, 2], [0, 1, 0], label='Line 1')
ax2.plot([0, 1, 2], [2, 1, 2], label='Line 2')
legend1 = ax1.legend(bbox_to_anchor=(1.4, 0.9), loc='upper right')
legend1.set_zorder(100)
legend1.set_clip_on(False)
legend2 = ax2.legend(bbox_to_anchor=(0.2, 0.8), loc='upper right')
plt.show()

图例遮挡效果

问题原因

图例默认是所属Axes(子图)的子元素,而Matplotlib中右侧子图的zorder默认高于左侧子图,因此右侧子图会整体覆盖左侧子图的所有子元素——包括其图例。单独修改图例的zorder无法突破父级Axes的层级限制。

解决方法

方法1:将左侧图例移至Figure层级

把左侧图例从所属子图中移除,添加到Figure的图例集合中,让图例直接受Figure管理,设置更高的zorder即可显示在所有子图之上:

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot([0, 1, 2], [0, 1, 0], label='Line 1')
ax2.plot([0, 1, 2], [2, 1, 2], label='Line 2')

# 创建左侧图例并转移到Figure层级
legend1 = ax1.legend(bbox_to_anchor=(1.4, 0.9), loc='upper right')
fig.legends.append(legend1)
ax1.legends.remove(legend1)
legend1.set_zorder(100)
legend1.set_clip_on(False)

legend2 = ax2.legend(bbox_to_anchor=(0.2, 0.8), loc='upper right')
plt.show()

方法2:调整右侧子图的zorder

降低右侧子图的zorder使其低于左侧子图,同时设置右侧子图背景透明(避免覆盖左侧内容):

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot([0, 1, 2], [0, 1, 0], label='Line 1')
ax2.plot([0, 1, 2], [2, 1, 2], label='Line 2')

# 降低右侧子图的层级,使其低于左侧
ax2.set_zorder(ax1.get_zorder() - 1)
# 设置右侧子图背景透明,防止覆盖左侧内容
ax2.patch.set_alpha(0)

legend1 = ax1.legend(bbox_to_anchor=(1.4, 0.9), loc='upper right')
legend1.set_clip_on(False)
legend2 = ax2.legend(bbox_to_anchor=(0.2, 0.8), loc='upper right')
plt.show()

方法3:直接在Figure层面创建所有图例

跳过子图创建图例的步骤,直接在Figure上生成图例,所有图例都属于Figure层级,可自由控制显示顺序:

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2)
# 先获取绘图对象
line1, = ax1.plot([0, 1, 2], [0, 1, 0])
line2, = ax2.plot([0, 1, 2], [2, 1, 2])

# 在Figure上分别创建两个图例
fig.legend([line1], ['Line 1'], bbox_to_anchor=(1.4, 0.9), loc='upper right')
fig.legend([line2], ['Line 2'], bbox_to_anchor=(0.2, 0.8), loc='upper right')

plt.show()

内容的提问来源于stack exchange,提问作者herrlich10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:58:03