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

如何在seaborn countplot上添加指定时段阴影区域

seaborn countplot添加疫情封锁期阴影区域实现方案

countplot基于matplotlib轴对象渲染,直接使用ax.axvspan()绘制垂直跨轴阴影带即可,核心是要匹配分类x轴上每个日期对应的整数位置。

具体实现步骤

  • 先完成基础countplot绘制
  • 提取x轴刻度标签和位置的映射关系
  • 遍历所有封锁期的起止日期,对应到x轴位置后绘制半透明阴影,注意将阴影层级放在柱子下方
  • 可选添加封锁期图例、调整x轴标签避免重叠

完整代码

import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.patches import Patch

# 原有基础绘图代码
fig, ax = plt.subplots(figsize=(16, 10))
sns.countplot(data=df, x='dates', ax=ax)

# 构建日期与x轴位置的映射字典
date_to_xpos = {tick_label.get_text(): pos for pos, tick_label in enumerate(ax.get_xticklabels())}

# 遍历所有封锁期绘制阴影,假设疫情数据集列名为start_date、end_date,存储格式与df.dates一致
for _, period in covid_lockdown_df.iterrows():
    # 阴影左右偏移0.5,刚好覆盖对应日期的整根柱子,对齐柱子间隙
    x_start = date_to_xpos[str(period['start_date'])] - 0.5
    x_end = date_to_xpos[str(period['end_date'])] + 0.5
    # alpha控制透明度,zorder=0保证阴影在柱子下层不遮挡数据
    ax.axvspan(x_start, x_end, color='#888888', alpha=0.3, zorder=0)

# 可选优化:旋转x轴标签、添加封锁期图例
plt.xticks(rotation=45, ha='right')
legend_item = [Patch(facecolor='#888888', alpha=0.3, label='新冠疫情封锁期')]
ax.legend(handles=legend_item, loc='upper right')

plt.tight_layout()
plt.show()

注意事项

  • 做日期位置映射时,务必保证封锁期数据集的日期格式和x轴刻度标签格式完全一致:如果是字符串就统一编码规则,如果是datetime类型就不要混着字符串传,不然会触发KeyError
  • 要是某段封锁期的起止日期不在你的房产数据集日期范围内,提前加个判断过滤掉,不用硬匹配
  • zorder=0必须加,不然阴影会盖在柱子上面,把计数条挡住就白画了
  • 阴影颜色、透明度自己按需调,只要不遮挡柱子的数值展示就行

参考素材

新冠日期数据示例
最终实现效果参考

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:33:22