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

matplotlib绘制月度时间序列X轴月份标签起始错位问题求助

问题原因

你通过freq='M'生成的日期为每个月的最后一天(例:第一个数据点日期为2001-01-31),而mdates.MonthLocator()默认将刻度设置在每月第1天,导致数据点和刻度位置错位,才会出现1月数据对应2月标签的问题。

解决方案

方案1:调整月度定位器的刻度位置(推荐,无需修改原始数据)

将MonthLocator的bymonthday参数设置为-1,让刻度对应每个月的最后一天,和你的数据点位置完全对齐:

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


df = pd.DataFrame({'date':pd.date_range('2001-01-01 00:00',end = '2001-12-31 23:59',freq='M'),
                  'value': np.array([1.63240641, 0.71793968, 0.15350684, 2.14915722, 0.45236403,
                                     0.48638794, 0.74329402, 0.38316468, 0.96695818, 0.80566539,
                                     1.23177184,0.556])})
df['Date'] = pd.to_datetime(df.date.astype(str), format='%Y-%m-%d',errors ='coerce') 
df.set_index('Date',inplace = True)
df.drop(columns = 'date', axis = 1,inplace = True)

fig,ax = plt.subplots()
ax.plot(df.index, df.value, color = 'tab:red', ls = '-.', marker = 'p')

# 核心修改:指定刻度在每月最后一天
locator = mdates.MonthLocator(bymonthday=-1)
formatter = mdates.DateFormatter('%b')
X = plt.gca().xaxis
X.set_major_locator(locator)
X.set_major_formatter(formatter)

plt.show()

方案2:调整数据日期为每月第一天

如果你希望刻度默认显示在每月1号,可直接将索引转换为当月第一天:

# 在设置索引后添加这一行即可
df.index = df.index.to_period('M').to_timestamp()

后续绘图代码无需修改,默认的MonthLocator()就能和数据点对齐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:15:08