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
相关产品推荐
相关产品推荐

