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

Python时间轴X轴范围调整:仅显示1970-2020年份

解决时间轴X轴显示问题

原代码的问题在于X轴使用了按月定位的MonthLocator,导致仅显示1970年附近的月份,无法覆盖1970-2020的年份范围。以下是修改后的完整代码,实现X轴仅显示1970、1980…2020的年份:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates
import pandas as pd  # 补全原代码遗漏的pandas导入

df = pd.DataFrame(
    {
        'event': ['a', 'b','c','d','e','f'],
       'date': ['1970','1980','1990','2000','2010','2020']
    }
)

df['date'] = pd.to_datetime(df['date'])

levels = np.tile(
    [-5, 5, -3, 3, -1, 1],
    int(np.ceil(len(df)/6))
)[:len(df)]

fig, ax = plt.subplots(figsize=(12.8, 4), constrained_layout=True);
ax.set(title="A series of events")

ax.vlines(df['date'], 0, levels, color="tab:red");  # 垂直茎线
ax.plot(   # 基线及标记点
    df['date'],
    np.zeros_like(df['date']),
    "-o",
    color="k",
    markerfacecolor="w"
);

# 标注事件文本
for d, l, r in zip(df['date'], levels, df['event']):
    ax.annotate(
        r,
        xy=(d, l),
        xytext=(-3, np.sign(l)*3),
        textcoords="offset points",
        horizontalalignment="right",
        verticalalignment="bottom" if l > 0 else "top"
    );

# 修改X轴设置:每10年一个刻度,仅显示年份
ax.xaxis.set_major_locator(mdates.YearLocator(base=10));  # 每10年生成一个刻度
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y"));  # 格式化为仅显示年份
plt.setp(ax.get_xticklabels(), rotation=0, ha="center");  # 标签居中,无需旋转

# 移除Y轴和多余边框
ax.yaxis.set_visible(False);
ax.spines["left"].set_visible(False)
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)    
ax.margins(y=0.1);
plt.show();

关键修改说明:

  • 补全原代码遗漏的import pandas as pd,否则无法创建DataFrame
  • 将X轴定位器从MonthLocator替换为YearLocator(base=10),确保每10年生成一个刻度
  • 用DateFormatter("%Y")将X轴标签格式化为仅显示年份
  • 调整X轴标签的对齐方式为居中,无需旋转(仅显示年份,长度较短)
  • 移除重复的ax.yaxis.set_visible(False)语句

修改后,X轴会自动适配1970-2020的范围,且仅显示指定的年份刻度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:46:13