如何设置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()
代码说明
- 导入
FuncFormatter用于自定义刻度格式逻辑 - 定义
format_date函数:将刻度值转为日期对象,判断是否为1月,返回对应格式- 1月返回
yy.m格式(如23.01) - 其他月份返回
m格式(如02)
- 1月返回
- 通过
xaxis.set_major_formatter将自定义格式化器应用到X轴 - 调用
autofmt_xdate()自动旋转标签,避免重叠
内容的提问来源于stack exchange,提问作者user3685918
相关产品推荐
相关产品推荐

