如何基于条件为Matplotlib/Seaborn折线图叠加不同阴影区域
你可以搭配Matplotlib的axvspan方法完成需求,核心逻辑是先拆分出不同type对应的x轴区间,再给每个区间叠加半透明填充阴影,完整实现代码如下:
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt np.random.seed(0) rng = np.random.default_rng(2) mlist=[] for _ in range(4): m=np.random.rand(4).tolist() n=rng.integers(0, 6, size=(1)).tolist()*4 df = pd.DataFrame(zip(m,n), columns=['yval','type']) mlist.append(df) df=pd.concat(mlist).reset_index(drop=True).reset_index() # 绘图部分 fig, ax = plt.subplots(figsize=(10,6)) # 绘制基础折线 sns.lineplot(data=df, x="index", y="yval", ax=ax, color='black', linewidth=2) # 自定义不同type对应的填充颜色,可自行调整 type_color_map = { 0: '#f8766d', 1: '#7cae00', 2: '#00bfc4', 3: '#c77cff', 4: '#ffa500', 5: '#ff69b4' } # 提取连续相同type的区间 df['type_group'] = df['type'].diff().ne(0).cumsum() for _, group in df.groupby('type_group'): current_type = group['type'].iloc[0] x_left = group['index'].min() x_right = group['index'].max() # 添加阴影区域,alpha控制透明度 ax.axvspan(xmin=x_left, xmax=x_right, color=type_color_map[current_type], alpha=0.3, label=f'type={current_type}') plt.legend() plt.show()
补充说明:
- 你可以修改
type_color_map中的色值,匹配你需要的阴影样式 - 透明度参数
alpha推荐取值范围0.2~0.4,既可以清晰区分区间,也不会遮挡上方的折线 - 如果需要绘制沿y轴变化的不规则阴影,可替换使用Matplotlib的
fill_between方法,设置对应y轴上下边界参数即可
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

