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

使用pandas date_range时Matplotlib主次刻度错位问题

问题根源与解决方案

问题原因

你遇到的主次刻度错位,核心原因是**AutoMinorLocator(12)的工作逻辑不匹配日期轴的特性**:
AutoMinorLocator会把两个主刻度之间的轴长度均匀分割成12份,但日期轴的底层数值是按天数计算的,不同月份的天数(28/30/31天)不一致,导致这些均匀分割的位置和实际月份的日期完全错位。

修复方案

放弃AutoMinorLocator,改用mdates.MonthLocator()作为次刻度定位器——它会精准定位到每个月的对应日期(和你生成的月末数据完全匹配),彻底解决错位问题。

修改后的可运行代码

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib.dates as mdates

x_range = pd.date_range('2015-01-01', '2021-06-01', freq='m')
y = np.linspace(1,1, len(x_range))

fig, ax = plt.subplots(figsize=(10, 1))
ax.plot(x_range, y)

# 主刻度:每年一次,定位到每年12月最后一天(和数据的月末日期对齐)
major_loc = mdates.MonthLocator(interval=12, bymonthday=-1)
ax.xaxis.set_major_locator(major_loc)
# 次刻度:每个月一次,自动匹配数据的月末日期
ax.xaxis.set_minor_locator(mdates.MonthLocator())

# 主刻度显示年份
fmt = mdates.DateFormatter('%Y')
ax.xaxis.set_major_formatter(fmt)

# 优化次刻度视觉效果(可选)
ax.tick_params(axis='x', which='minor', length=3, color='#999999')

plt.show()

额外说明

  • 若希望主刻度在每年1月而非12月,可将主刻度参数改为mdates.MonthLocator(interval=12, bymonth=1, bymonthday=-1),同样会和你的月末数据对齐。
  • mdates.MonthLocator()默认会识别数据中的日期规律,自动匹配对应的月份位置,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:22:14