如何在Matplotlib的重复Y轴上设置次要刻度?
实现Matplotlib双Y轴主次刻度分离(无需重复绘图)
你不需要在双轴上重复绘制所有曲线,只需要同步双轴与主轴的Y轴范围和主刻度定位器,就能实现一个轴仅显示主刻度、另一个轴显示主次刻度的效果,同时所有曲线只需要在主轴绘制一次即可。
改进思路
- 所有绘图操作仅在主轴完成,避免冗余的重复绘制
- 同步双轴的Y轴范围与主轴,确保刻度数值完全一致
- 给双轴设置与主轴相同的主刻度定位器,保证主刻度位置对齐
- 为主轴隐藏次要刻度,给双轴添加次要刻度
- 可选添加范围变化回调,实现缩放时自动同步双轴范围
改进后的完整代码
import numpy as np from datetime import date from matplotlib import pyplot as plt from matplotlib.ticker import AutoMinorLocator, AutoLocator dates = [date(2023, 3, 1), date(2023, 3, 2), date(2023, 3, 3), date(2023, 3, 4), date(2023, 3, 5)] sample = np.arange(5) fig, ax = plt.subplots(figsize=(4, 6), constrained_layout=True) twin_y_ax = ax.twinx() # 主轴配置:仅显示主刻度,隐藏次要刻度 ax.yaxis.set_major_locator(AutoLocator()) ax.yaxis.set_minor_locator(plt.NullLocator()) # 所有曲线仅在主轴绘制,示例3条曲线(10条的话直接继续添加plot即可) ax.plot(dates, sample**2, linestyle="dotted", label="曲线1") ax.plot(dates, sample*2, linestyle="solid", label="曲线2") ax.plot(dates, sample+3, linestyle="dashdot", label="曲线3") # 同步双轴与主轴的Y范围,确保刻度数值一致 twin_y_ax.set_ylim(ax.get_ylim()) # 双轴主刻度定位器与主轴保持一致,保证主刻度位置对齐 twin_y_ax.yaxis.set_major_locator(AutoLocator()) # 双轴添加次要刻度 twin_y_ax.yaxis.set_minor_locator(AutoMinorLocator()) # 自动同步范围:当主轴Y范围变化(比如手动缩放),双轴自动跟随更新 def sync_ylim(event): twin_y_ax.set_ylim(ax.get_ylim()) ax.callbacks.connect('ylim_changed', sync_ylim) # 格式化X轴标签 for label in ax.get_xticklabels(which="major"): label.set(rotation=30, horizontalalignment="right") ax.legend() plt.show()
关键改进点说明
- 无需重复绘图:所有曲线只在主轴绘制一次,不管是10条还是更多,都不需要在双轴上重复绘制,大幅减少冗余代码
- 刻度完全对齐:通过同步Y范围和主刻度定位器,两个Y轴的主刻度数值、位置完全一致,不会出现错位
- 动态同步范围:添加的
ylim_changed回调函数可以确保用户手动缩放图表时,双轴范围自动跟随主轴更新,保持刻度一致 - 明确刻度控制:用
plt.NullLocator()明确隐藏主轴的次要刻度,避免默认显示的情况
内容的提问来源于stack exchange,提问作者user136555
相关产品推荐
相关产品推荐

