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

如何用Matplotlib复刻Pandas绘图的无重叠时间序列轴刻度

解决Matplotlib复刻Pandas日期轴无重叠标签的问题

问题描述

通过Pandas代码 pd.Series([1]*month_limits.size, month_limits).plot(ax=ax) 生成的图表中,X轴的年份与月份标签不会互相覆盖,但使用纯Matplotlib实现时,年份标签会覆盖月份标签,尝试的代码如下:

import datetime

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

month_limits = pd.date_range('2021-08', '2023-01', freq="1m",
                             normalize=True) + datetime.timedelta(days=1)
plt.plot(month_limits, [1]*month_limits.size)

l1 = mdates.YearLocator()
l2 = mdates.MonthLocator(interval=1)
ax.xaxis.set_major_locator(l1)
ax.xaxis.set_minor_locator(l2)
ax.xaxis.set_major_formatter(mdates.ConciseDateFormatter(l1))
ax.xaxis.set_minor_formatter(mdates.ConciseDateFormatter(l2))

解决方案

要复刻Pandas的效果,核心是让年份标签仅在对应年份的起始月份上方显示,且与月份标签拉开距离。具体实现如下:

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

# 生成日期序列与对应数据
month_limits = pd.date_range('2021-08', '2023-01', freq="1m",
                             normalize=True) + datetime.timedelta(days=1)
values = [1]*month_limits.size

# 创建画布与轴对象
fig, ax = plt.subplots()
ax.plot(month_limits, values)

# 设置刻度定位器:主刻度对应每年起始,副刻度对应每个月
year_locator = mdates.YearLocator()
month_locator = mdates.MonthLocator(interval=1)
ax.xaxis.set_major_locator(year_locator)
ax.xaxis.set_minor_locator(month_locator)

# 自定义主刻度(年份)格式:仅在当年第一个月份显示年份
def year_formatter(x, pos):
    dt = mdates.num2date(x)
    return f"{dt.year}" if dt.month == 1 else ""
ax.xaxis.set_major_formatter(year_formatter)

# 设置副刻度(月份)格式:显示月份缩写
month_formatter = mdates.DateFormatter('%b')
ax.xaxis.set_minor_formatter(month_formatter)

# 调整标签位置与样式:年份标签上移,区分主次刻度字号
ax.tick_params(axis='x', which='major', pad=15, labelsize=10)
ax.tick_params(axis='x', which='minor', labelsize=8)

# 自动优化布局,避免标签被截断
plt.tight_layout()
plt.show()

关键说明

  • 刻度定位:YearLocator() 确保年份刻度落在每年的起始位置,MonthLocator(interval=1) 让每个月都生成一个副刻度
  • 格式控制:主刻度的自定义格式化函数仅在当年第一个月份显示年份,其余位置留空,避免重复覆盖;副刻度用 %b 显示月份缩写(如Jan、Feb)
  • 标签间距:通过 tick_params 的 pad 参数将年份标签上移,拉开与月份标签的垂直距离,同时用字号区分主次刻度
  • 布局优化:tight_layout() 自动调整图表边距,防止日期标签被画布边缘截断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:13:09