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
相关产品推荐
相关产品推荐

