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

Matplotlib时间序列绘图:仅在每年1月显示年份的配置方法

解决Matplotlib时间序列图仅每年1月显示年份的问题

这个问题我之前也碰到过——matplotlib的自动日期格式化逻辑比较死板,单纯调整rcParams里的date.autoformatter.month和year参数没法实现你要的效果,因为当刻度是按月生成时,只会触发month对应的格式化规则,不会自动切换到year的格式。

要实现仅每年1月显示月份+年份,其他月份只显示月份缩写的效果,你需要自定义日期格式化函数,搭配MonthLocator来精确控制刻度和显示内容。下面是具体的实现步骤和代码示例:

步骤1:导入必要的库

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime, timedelta
import numpy as np

步骤2:生成测试时间序列数据

先造一些模拟数据来演示效果:

# 生成从2022年1月到2024年6月的每月日期
start_date = datetime(2022, 1, 1)
dates = [start_date + timedelta(days=30*i) for i in range(30)]
values = np.random.randn(30).cumsum()  # 随机生成的时间序列值

步骤3:自定义日期格式化函数

写一个函数,判断当前刻度对应的日期是否是1月,如果是则显示月份缩写+年份,否则只显示月份缩写:

def custom_date_formatter(x, pos):
    # 将刻度值转换为datetime对象
    date = mdates.num2date(x)
    # 判断是否是1月
    if date.month == 1:
        return date.strftime('%b %Y')  # 比如 Jan 2022
    else:
        return date.strftime('%b')     # 比如 Feb, Mar

步骤4:绘图并应用自定义格式

设置每月刻度,然后把自定义格式化函数绑定到x轴:

fig, ax = plt.subplots(figsize=(10, 6))

# 绘制时间序列图
ax.plot(dates, values)

# 设置x轴主刻度为每月
ax.xaxis.set_major_locator(mdates.MonthLocator())

# 应用自定义格式化函数
ax.xaxis.set_major_formatter(mdates.FuncFormatter(custom_date_formatter))

# 旋转刻度标签,避免重叠
plt.xticks(rotation=45)

plt.tight_layout()
plt.show()

关键说明

  • MonthLocator():确保x轴每个月都生成一个刻度,是实现精准控制的基础。
  • FuncFormatter():允许你完全自定义刻度的显示内容,通过判断日期的月份来动态切换格式。
  • 如果你的数据是用pandas的DataFrame存储的,逻辑完全一样,只需要把ax.plot(df.index, df.values)替换成对应的绘图代码,然后同样设置locator和formatter即可。

这样设置后,x轴上每年1月的刻度会显示类似Jan 2022的格式,其他月份只显示Feb、Mar等缩写,完美符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:07:00