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

Pandas与Matplotlib绘图:如何在X轴仅显示唯一年份标签并补全缺失年份

解决Matplotlib X轴仅显示年份并补全年份缺失的问题

我明白你遇到的问题了——直接用index.year.unique()设置刻度没效果,而且大数据集里还会缺少年份。这是因为Matplotlib的datetime轴需要的是datetime类型的刻度位置,而不是单纯的整数年份,另外默认的刻度器可能会跳过一些年份来避免拥挤。下面是具体的解决方法:

核心思路

  1. 使用matplotlib.dates模块的YearLocator来精准定位每年的刻度
  2. 用DateFormatter将刻度格式化为仅显示年份
  3. 手动设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:12:42