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

如何设置Matplotlib X轴:仅每年首月显示yy.m,其余显示m

自定义Matplotlib日期X轴格式

问题描述

现有如下示例代码:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 创建包含日期和数据的DataFrame
data = {'Date': ['2023-01-01', '2023-02-01', '2023-03-01', '2024-01-01', '2024-02-01'],
        'Value': [10, 15, 13, 18, 20]}
df = pd.DataFrame(data)

# 将Date列转为datetime类型
df['Date'] = pd.to_datetime(df['Date'])

# 绘制折线图
plt.plot(df['Date'], df['Value'], marker='o', linestyle='-')
plt.xlabel('Date')
plt.ylabel('Y轴标签')
plt.title('图表标题')

当前输出效果:
当前输出

希望将X轴格式调整为:仅每年的第一个月份显示yy.m格式,其余月份仅显示m格式,期望效果如下:
期望效果

解决方案

可以通过matplotlib.ticker.FuncFormatter自定义刻度格式化逻辑,判断每个日期是否为当年1月,再返回对应的显示格式:

修改后的完整代码:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.ticker import FuncFormatter

# 创建包含日期和数据的DataFrame
data = {'Date': ['2023-01-01', '2023-02-01', '2023-03-01', '2024-01-01', '2024-02-01'],
        'Value': [10, 15, 13, 18, 20]}
df = pd.DataFrame(data)

# 将Date列转为datetime类型
df['Date'] = pd.to_datetime(df['Date'])

# 绘制折线图
plt.plot(df['Date'], df['Value'], marker='o', linestyle='-')
plt.xlabel('Date')
plt.ylabel('Y轴标签')
plt.title('图表标题')

# 自定义X轴日期格式化函数
def format_date(x, pos):
    date = mdates.num2date(x)
    # 判断是否是当年1月
    if date.month == 1:
        return date.strftime('%y.%m')
    else:
        return date.strftime('%m')

# 应用自定义格式化器
plt.gca().xaxis.set_major_formatter(FuncFormatter(format_date))

# 自动调整X轴标签避免重叠
plt.gcf().autofmt_xdate()

plt.show()

代码说明

  1. 导入FuncFormatter用于自定义刻度格式逻辑
  2. 定义format_date函数:将刻度值转为日期对象,判断是否为1月,返回对应格式
    • 1月返回yy.m格式(如23.01)
    • 其他月份返回m格式(如02)
  3. 通过xaxis.set_major_formatter将自定义格式化器应用到X轴
  4. 调用autofmt_xdate()自动旋转标签,避免重叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:16:20