如何在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
相关产品推荐
相关产品推荐

