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

如何在Seaborn折线图中为时间序列的指定趋势区间添加背景色与起止标记

在Seaborn折线图中标记指定时间区间的趋势(绿色背景填充+起止标记)

Hey there! 我来帮你实现这个需求——给折线图里2017-01到2017-08的区间加上绿色背景填充,同时明确标记这段区间的起止位置。咱们直接结合你的模拟数据来调整代码,效果拉满:

完整实现代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 生成你的模拟数据
df = pd.DataFrame(np.random.randint(100, size=50), columns=['max'])
df['day'] = pd.date_range('2016-1-1', periods=50, freq='SMS')  # 半月频率
df['date'] = df['day'].dt.strftime('%Y-%m')

# 初始化绘图画布
plt.figure(figsize=(10,6))
# 绘制基础折线图
sns.lineplot(data=df, x='date', y='max')

# 定义需要标记的目标区间
target_start = '2017-01'
target_end = '2017-08'

# 把日期列转成列表,找到目标区间在x轴上的索引位置
date_list = df['date'].tolist()
start_idx = date_list.index(target_start)
end_idx = date_list.index(target_end)

# 添加半透明绿色背景填充(alpha控制透明度,避免遮挡折线)
plt.axvspan(start_idx, end_idx, color='green', alpha=0.2)

# 标记区间起止位置:虚线+文字标注
plt.axvline(x=start_idx, color='darkgreen', linestyle='--', linewidth=1.5)
plt.text(start_idx, plt.ylim()[1]*0.9, target_start, ha='center', color='darkgreen', fontweight='bold')

plt.axvline(x=end_idx, color='darkgreen', linestyle='--', linewidth=1.5)
plt.text(end_idx, plt.ylim()[1]*0.9, target_end, ha='center', color='darkgreen', fontweight='bold')

# 调整x轴标签显示
plt.xticks(rotation=45)
plt.tight_layout()  # 自动调整布局,防止标签被截断
plt.show()

关键步骤解释

  • axvspan() 实现背景填充:这个函数专门用来给x轴指定区间添加色块,alpha参数设置为0.2是为了让背景半透明,既突出区间又不会遮挡折线数据。
  • axvline() + text() 标记起止:用深绿色虚线画出区间的左右边界,再在图表上方添加日期文字标注,让区间范围一目了然。
  • 索引匹配逻辑:因为x轴用的是%Y-%m格式的字符串,所以先把date列转成列表,通过index()找到目标日期对应的x轴索引,才能精准定位区间位置。

特殊情况处理(可选)

如果你的数据中存在重复的月份(比如半月频率下同一个月会有多个数据点),index()只会返回第一个匹配的索引,这时候可以用np.where()来获取完整的区间范围:

# 处理重复月份的情况,获取区间的首尾索引
start_indices = np.where(df['date'] == target_start)[0]
end_indices = np.where(df['date'] == target_end)[0]
start_idx = start_indices[0]
end_idx = end_indices[-1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:29:10