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

基于Datetime X轴批量填充垂直区域的优化方案咨询

优化Matplotlib时间轴垂直区域填充方案

你可以通过**定义时间段列表+循环批量调用axvspan**的方式解决手动输入坐标的问题,既精准又高效。核心思路是用直观的日期字符串代替手动计算的matplotlib日期数值,通过官方工具自动转换坐标,避免人为误差。

实现步骤:

  1. 把所有需要填充的时间段整理成字符串元组列表,清晰明了;
  2. 使用matplotlib.dates.date2num将日期字符串转换为matplotlib坐标轴识别的数值;
  3. 循环遍历时间段列表,自动生成垂直填充区域。

完整优化代码:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.ticker as mticker
import pandas as pd
import numpy as np  # 补充原代码缺失的numpy导入

# 创建随机数据
df = pd.DataFrame({
    "value": np.random.randint(0, 100, 263),
    "time": pd.date_range("2000-01-01", "2021-11-01", freq="MS")
})

# 绘制基础图表
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(15, 12))
ax.plot(df.time, df.value)
ax.xaxis.set_major_locator(mdates.YearLocator(2))
ax.xaxis.set_minor_locator(mticker.AutoMinorLocator(2))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y"))

# 定义需要填充的时间段列表(起始日期,结束日期)
fill_periods = [
    ("2000-01-01", "2000-05-31"),
    ("2003-12-01", "2004-05-31"),
    ("2004-12-01", "2005-05-31"),
    ("2010-01-01", "2010-05-31"),
    ("2016-01-01", "2016-05-31"),
    ("2020-01-01", "2020-05-31")
]

# 循环批量填充垂直区域
for start_date, end_date in fill_periods:
    # 将日期字符串转换为matplotlib识别的坐标轴数值
    xmin = mdates.date2num(pd.to_datetime(start_date))
    xmax = mdates.date2num(pd.to_datetime(end_date))
    ax.axvspan(xmin, xmax, ymin=0.01, ymax=0.98, alpha=0.7, color='gray')

plt.show()

优势说明:

  • 精准无误差:通过pd.to_datetime和mdates.date2num自动转换坐标,完全避免手动计算日期数值的错误;
  • 可维护性强:需要修改或新增时间段时,直接在fill_periods列表中添加即可,无需重复编写axvspan代码;
  • 直观易懂:用日期字符串定义时间段,比纯数字坐标更易理解和排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:00:46