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

Matplotlib:设置从指定日期开始的等间隔刻度与标签

解决方案

1. 精准设置年份刻度标签

dates.YearLocator(base=4)默认会从能被4整除的年份(比如1968)开始生成刻度,要完全匹配你的lab列表,直接用固定刻度定位器+格式化器更可靠:

  • 把lab里的年份转换成datetime对象(取每年1月1日作为刻度锚点)
  • 用ax.set_xticks()指定这些精确的日期位置
  • 用FixedFormatter只显示年份数值

2. 消除填充区域外的空白

直接将x轴范围锁定在数据的起止日期,再配合tight_layout()优化整体布局,就能彻底去掉多余空白。

3. 过滤图例项

给失业率曲线设置label="_nolegend_",Matplotlib会自动跳过这个系列的图例;或者手动创建图例元素,只保留共和党、民主党的条目。


修改后的可复现代码

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.ticker import FixedFormatter
import pandas as pd
import datetime as dt

# 模拟数据(匹配你的时间范围)
dates = pd.date_range(start='1969-01-01', end='2025-12-31', freq='Y')
unemp_rate = pd.Series([5 + i*0.1 for i in range(len(dates))], index=dates)

# 定义两党执政区间(示例结构,可替换为你的真实数据)
rep_periods = [(dt.datetime(1969,1,1), dt.datetime(1977,1,1)),
               (dt.datetime(1981,1,1), dt.datetime(1993,1,1)),
               (dt.datetime(2001,1,1), dt.datetime(2009,1,1)),
               (dt.datetime(2017,1,1), dt.datetime(2021,1,1))]
dem_periods = [(dt.datetime(1977,1,1), dt.datetime(1981,1,1)),
               (dt.datetime(1993,1,1), dt.datetime(2001,1,1)),
               (dt.datetime(2009,1,1), dt.datetime(2017,1,1)),
               (dt.datetime(2021,1,1), dt.datetime(2025,12,31))]

# 绘图初始化
fig, ax = plt.subplots(figsize=(12,6))

# 绘制失业率曲线,设置特殊label跳过图例
ax.plot(unemp_rate.index, unemp_rate, label="_nolegend_", color='black', linewidth=2)

# 填充执政区域
for start, end in rep_periods:
    ax.axvspan(start, end, color='red', alpha=0.2)
for start, end in dem_periods:
    ax.axvspan(start, end, color='blue', alpha=0.2)

# 自定义年份刻度
lab = [1969, 1973, 1977, 1981, 1985, 1989, 1993, 1997, 2001, 2005, 2009, 2013, 2017, 2021, 2025]
tick_positions = [dt.datetime(year, 1, 1) for year in lab]
ax.set_xticks(tick_positions)
ax.xaxis.set_major_formatter(FixedFormatter([str(y) for y in lab]))

# 移除边缘空白
ax.set_xlim(tick_positions[0], tick_positions[-1])
plt.tight_layout()

# 添加仅含两党的图例
from matplotlib.patches import Patch
legend_elements = [Patch(facecolor='red', alpha=0.2, label='共和党'),
                   Patch(facecolor='blue', alpha=0.2, label='民主党')]
ax.legend(handles=legend_elements)

plt.show()

关键修改说明

  • 刻度控制:放弃自动刻度生成,手动指定刻度位置,完全对齐你的lab列表,避免起始年份偏移问题
  • 空白消除:通过set_xlim将x轴范围严格限定在第一个和最后一个刻度的日期,配合tight_layout()消除冗余空白
  • 图例过滤:两种方式可选:一是给失业率曲线加label="_nolegend_"自动隐藏;二是手动创建图例元素,精准控制显示内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:36:05