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

