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

Matplotlib双轴标签重叠问题:求规范的双轴标签设置方法

解决Matplotlib双y轴标签重叠问题的规范方法

问题场景

绘制上下排列的两个时间序列子图:上方子图左y轴显示7条移动平均线(p1 DataFrame),右y轴显示原始指数数据(pidx DataFrame);下方子图为T2108指标与原始指数的双y轴对比。当前上方子图的右y轴标签与左y轴标签重叠,调整标签位置时出现语法错误,需要规范的双轴标签配置方案。

修正后的完整代码

import matplotlib.pyplot as plt

p1 = above_below_ma_df.tail(lookback)
p2 = t2108.tail(lookback)
pidx = idx.tail(lookback)

# 创建子图,调整子图间距
fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(15, 10))

# ---------------------- 上方子图绘制 ----------------------
axs[0].plot(p1.index, p1, linewidth=1)
axs[0].set_ylabel('% stocks above MAs')
axs[0].set_title(f"{code} - No. stocks above/below MAs")
axs[0].legend(labels=p1.columns, loc='upper left')

# 添加右y轴并绘制指数
axs0_twin = axs[0].twinx()
axs0_twin.plot(p1.index, pidx, 'black', linewidth=2, label=code)
# 设置右y轴标签颜色,并调整位置避免重叠
axs0_twin.set_ylabel(code, color='black')
# 用归一化坐标调整标签位置:(1.1, 0.1)表示子图右侧外部、垂直方向10%高度处
axs0_twin.yaxis.set_label_coords(1.1, 0.1)

# 合并双轴图例
lines0, labels0 = axs[0].get_legend_handles_labels()
lines0_twin, labels0_twin = axs0_twin.get_legend_handles_labels()
axs0_twin.legend(lines0 + lines0_twin, labels0 + labels0_twin, loc='upper left')

# ---------------------- 下方子图绘制 ----------------------
axs[1].plot(p2.index, p2, color='b', alpha=0.7, label='T2108')
axs[1].set_xlabel('Date')
axs[1].set_ylabel('T2108-(%>40MA)', color='b')
axs[1].axhline(y=15, color='b', linestyle='--')
axs[1].axhline(y=85, color='b', linestyle='--')

# 添加右y轴并绘制指数
axs1_twin = axs[1].twinx()
axs1_twin.plot(p2.index, pidx, 'black', label=code)
axs1_twin.set_ylabel(code, color='black')

# 合并双轴图例
lines1, labels1 = axs[1].get_legend_handles_labels()
lines1_twin, labels1_twin = axs1_twin.get_legend_handles_labels()
axs1_twin.legend(lines1 + lines1_twin, labels1 + labels1_twin, loc='upper left')

# 自动调整子图间距,避免标签、标题重叠
plt.tight_layout()
plt.show()

return above_below_ma_df, t2108

关键调整说明

  1. 修正标签设置语法:将错误的axs0_twin.ylabel()改为标准的axs0_twin.set_ylabel(),避免语法报错
  2. 灵活调整标签位置:通过yaxis.set_label_coords(x, y)使用归一化坐标定位右y轴标签,x=1.1将标签移至子图右侧外部,y=0.1将标签放在垂直方向偏下位置,彻底避免与左y轴标签重叠
  3. 优化整体布局:添加plt.tight_layout()自动调整子图间距,同时移除上方子图的重复x轴标签,让布局更整洁
  4. 规范图例创建:保持双轴图例合并的逻辑,确保所有曲线标签正确显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:10:13