Python Matplotlib绘图x轴显示为0起始值而非分组时间值的咨询
问题根因
你当前绘图代码只向plt.plot()传入了y轴对应的数值(即WTS_summary.values),没有显式指定x轴对应的数据源。这种情况下matplotlib会自动以从0开始的整数序列作为x轴刻度,自然不会显示分组得到的年月值。
另外你在分组时使用的YearMonth是pandas的Period类型,部分matplotlib版本对该类型的直接渲染适配不佳,需要先转换为绘图可识别的格式,避免刻度顺序错位。
具体调整步骤
1. 转换索引为适配绘图的格式
在你生成WTS_summary的代码之后,把存储在WTS_summary索引里的Period类型年月值,转换为matplotlib原生支持的datetime格式:
# 将Period类型的索引转为对应月份第一天的datetime格式 WTS_summary.index = WTS_summary.index.to_timestamp()
这一步可以让matplotlib按照真实的时间逻辑排布刻度,不会出现日期顺序混乱的问题。
2. 绘图时显式指定x、y轴的数据源
修改原本的绘图代码,不再仅传入y值,要把转好格式的年月索引作为x轴传入:
plt.figure() # x轴为WTS_summary存储的年月索引,y轴为月度均值 plt.plot( WTS_summary.index, WTS_summary['Average Temp'], label='WTS Avg Temp', linewidth=1, alpha=0.7, c='salmon' )
3. (可选)自定义x轴刻度显示格式
如果自动生成的刻度显示成了2009-03-01这类带具体日期的冗余格式,可以手动调整刻度规则,让它直接显示为2009-03这种简洁的年月格式:
# 导入matplotlib的日期处理模块 import matplotlib.dates as mdates # 设置x轴主刻度为每月一个标记 plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=1)) # 设置刻度标签的显示格式为年-月 plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) # 旋转刻度标签避免文字重叠 plt.xticks(rotation=45)
其他便捷实现方案
- 字符串直传方案:如果不想处理datetime格式的兼容问题,可以直接把年月Period转成字符串类型作为x轴,完全规避格式适配问题:
# 把索引转成"2009-03"格式的字符串 WTS_summary['x_labels'] = WTS_summary.index.astype(str) plt.figure() plt.plot( WTS_summary['x_labels'], WTS_summary['Average Temp'], label='WTS Avg Temp', linewidth=1, alpha=0.7, c='salmon' )
该方案的优点是实现简单、无格式适配问题,x轴会直接显示需要的年月字符串;缺点是如果时间跨度极大,刻度的自动排布灵活性弱于datetime类型的x轴。
- pandas原生绘图方案:如果偏好和DataFrame联动的绘图逻辑,可以直接调用DataFrame自带的plot接口,该接口会自动把DataFrame的索引识别为x轴,不需要手动指定数据源:
WTS_summary.plot( y='Average Temp', label='WTS Avg Temp', linewidth=1, alpha=0.7, c='salmon' ) # 旋转刻度标签避免重叠 plt.xticks(rotation=45)
内容的提问来源于stack exchange,提问作者Python Rookie
相关产品推荐
相关产品推荐

