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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:52:50