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

如何让Matplotlib双轴图的图例自动覆盖ax2曲线并合理定位

双轴图图例覆盖及自动定位问题解决

问题说明

使用matplotlib的twinx()创建双轴并绘制多条曲线后,在主轴(ax)添加的图例无法覆盖次轴(ax2)的曲线,需要实现:

  • 图例在绘图区域内自动定位(支持loc="best")
  • 图例能够覆盖所有轴上的曲线

解决方案代码

import matplotlib.pyplot as plt
import numpy as np

# 生成x轴数据
x = np.linspace(0, 2*np.pi, 100)

# 创建画布和主轴
fig, ax = plt.subplots()
ax2 = ax.twinx()

# 主轴绘制曲线
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')

# 次轴绘制曲线(修正重复的label)
ax2.plot(x, np.cos(x+1), label='Cosine Shifted', color="red")
ax2.plot(x, x, label='Linear', color="green")

# 设置标题和坐标轴标签
ax.set_title('Sine and Cosine Functions')
ax.set_xlabel('X')
ax.set_ylabel('Y')

# 获取所有曲线的图例句柄和标签
lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()

# 添加图例:设置自动定位、高透明度背景,提升层级覆盖次轴曲线
legend = ax.legend(lines + lines2, labels + labels2, loc="best", framealpha=1.0)
# 确保图例层级高于次轴(ax2默认zorder比ax高,这里给图例设置更高的zorder)
legend.set_zorder(10)

plt.show()

关键修改点

  • 给ax.legend()添加loc="best"参数,实现绘图区域内自动定位(主轴的legend支持该参数,而fig.legend不支持)
  • 修正了次轴曲线重复的label,保证图例显示准确
  • 通过legend.set_zorder(10)将图例的层级设置为高于次轴(ax2),确保图例能覆盖次轴上的曲线
  • 保持framealpha=1.0让图例背景不透明,避免被曲线穿透

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:50:26