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
关键调整说明
- 修正标签设置语法:将错误的
axs0_twin.ylabel()改为标准的axs0_twin.set_ylabel(),避免语法报错 - 灵活调整标签位置:通过
yaxis.set_label_coords(x, y)使用归一化坐标定位右y轴标签,x=1.1将标签移至子图右侧外部,y=0.1将标签放在垂直方向偏下位置,彻底避免与左y轴标签重叠 - 优化整体布局:添加
plt.tight_layout()自动调整子图间距,同时移除上方子图的重复x轴标签,让布局更整洁 - 规范图例创建:保持双轴图例合并的逻辑,确保所有曲线标签正确显示
内容的提问来源于stack exchange,提问作者AndysPythonStuff
相关产品推荐
相关产品推荐

