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

Matplotlib:如何将Y轴刻度频率设置为每2或5单位

Matplotlib双Y轴图表刻度优化方案

需求1:确保水平参考线对应Y轴刻度显示为0

当前已添加Y=0的水平参考线,结合你设置的-50到30右侧轴范围,通过固定间隔刻度定位器可直接让0刻度显示在轴上。

需求2:规整左右Y轴刻度频率

左侧Y轴(柱状图轴)

替换原自动分配刻度的LinearLocator(5),使用MultipleLocator指定固定间隔,实现每2或5单位显示一次刻度:

# 每5单位一个刻度
ax1.yaxis.set_major_locator(mtick.MultipleLocator(5))
# 若需每2单位,改为:
# ax1.yaxis.set_major_locator(mtick.MultipleLocator(2))

该方法会严格按指定间隔生成刻度,比自动分配的刻度更规整。

右侧Y轴(折线图轴)

在你已有的轴范围规整代码基础上,搭配MultipleLocator设置统一间隔,匹配-50到30的区间:

ax2.yaxis.set_major_locator(mtick.MultipleLocator(10))

修改后的完整代码

import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
import matplotlib.dates as mdates
import numpy as np

fig, ax1 = plt.subplots(figsize=(8, 6))

# 创建共享X轴的双Y轴
ax2 = ax1.twinx()

# 绘制左侧柱状图
lns1 = [ax1.bar(plot_data.date, plot_data.VAR2, color='yellow', label="VAR2 Ratio", width=50)]
# 绘制右侧两条折线
lns2 = ax2.plot(plot_data.date, plot_data.VAR1, 'blue', label="VAR1 (RHS)")
lns3 = ax2.plot(plot_data.date, plot_data.VAR3, 'red', label="VAR3 (RHS)")

# 合并图例
lns = lns1 + lns2 + lns3
labs = [l.get_label() for l in lns]
ax1.legend(lns, labs, loc='upper center', bbox_to_anchor=(0.5, -0.2),
          fancybox=False, shadow=False, ncol=5, frameon=False)

def round_down(value, base=5):
    return base * np.floor(value / base)

def round_up(value, base=5):
    return base * np.ceil(value / base)

# 设置轴范围
ax1.set_ylim(bottom=0)
ax2.set_ylim(bottom=round_down(min(plot_data.VAR3), 10), top=round_up(max(plot_data.VAR3), 10))

# 添加Y=0的水平参考线
ax2.axhline(y=0, color='black', linewidth=1, linestyle='--')

# 关键修改:设置刻度间隔
ax1.yaxis.set_major_locator(mtick.MultipleLocator(5))  # 左侧Y轴每5单位一个刻度
ax2.yaxis.set_major_locator(mtick.MultipleLocator(10)) # 右侧Y轴每10单位一个刻度

# 设置百分比格式
formatter = mtick.PercentFormatter(xmax=100, decimals=0)
ax1.yaxis.set_major_formatter(formatter)
ax2.yaxis.set_major_formatter(formatter)

# 隐藏顶部边框
ax1.spines['top'].set_visible(False)
ax2.spines['top'].set_visible(False)

# 设置X轴刻度样式
ax1.tick_params(axis='x', labelsize=8, rotation=45)
start_date = plot_data.date.min()
ax1.set_xlim([start_date - 1, plot_data.date.max()])
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%b %y'))
ax1.xaxis.set_major_locator(mdates.MonthLocator(interval=3))

# 添加Y轴网格
ax1.grid(axis='y', color='grey', linestyle='-', linewidth=0.25, zorder=0)

plt.subplots_adjust(bottom=0.2)
plt.show()

补充说明

  • 左侧Y轴的间隔可根据数据范围灵活调整为2或5,避免刻度过密或过疏;
  • 右侧Y轴的10单位间隔与-50到30的轴范围完全匹配,刻度自动包含0,满足需求1;
  • 确保代码开头导入matplotlib.ticker模块,否则mtick会引发命名错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:02:34