Pandas与Matplotlib绘图:如何在X轴仅显示唯一年份标签并补全缺失年份
解决Matplotlib X轴仅显示年份并补全年份缺失的问题
我明白你遇到的问题了——直接用index.year.unique()设置刻度没效果,而且大数据集里还会缺少年份。这是因为Matplotlib的datetime轴需要的是datetime类型的刻度位置,而不是单纯的整数年份,另外默认的刻度器可能会跳过一些年份来避免拥挤。下面是具体的解决方法:
核心思路
- 使用
matplotlib.dates模块的YearLocator来精准定位每年的刻度 - 用
DateFormatter将刻度格式化为仅显示年份 - 手动设置X轴的范围,覆盖从数据最早年份到最晚年份的完整区间,确保缺失的年份也能显示出来
修改后的完整代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates # 新增这个模块 df = pd.DataFrame( { 'date': ['2011-01-01', '2011-02-01', '2012-01-01', '2012-02-01', ], 'amount': [100, 200, 250, 150,], } ) df.date = pd.to_datetime(df.date) df_TotalDay = df[['date','amount']].copy(deep=True) df_TotalDay = df_TotalDay.groupby('date').amount.sum() fig, ax = plt.subplots(figsize=(15,5)) ax.plot(df_TotalDay.index, df_TotalDay.values) # 设置X轴刻度和格式 # 1. 定位每年的1月1日作为刻度位置 ax.xaxis.set_major_locator(mdates.YearLocator()) # 2. 仅显示年份 ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y')) # 处理缺失年份:设置X轴范围为最早年份年初到最晚年份年末 min_year = df_TotalDay.index.year.min() max_year = df_TotalDay.index.year.max() ax.set_xlim(pd.Timestamp(f'{min_year}-01-01'), pd.Timestamp(f'{max_year}-12-31')) # 可选:旋转刻度标签避免重叠 plt.xticks(rotation=45, ha='right') plt.show()
针对大型数据集的补充说明
如果你的数据跨度大且有缺失年份(比如有2011、2013数据,缺2012),上面的代码会自动在X轴上显示2011、2012、2013三个年份,因为我们设置了完整的X轴范围,YearLocator会遍历这个范围内的每一年生成刻度。
另外,如果默认的YearLocator还是会跳过年份,可以传入参数base=1强制每年都显示:
ax.xaxis.set_major_locator(mdates.YearLocator(base=1))
这样就能完美实现你要的效果啦!
内容的提问来源于stack exchange,提问作者IamWarmduscher
相关产品推荐
相关产品推荐

