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

