如何让fill_between填充y=1到y=0全连续区域而非仅离散y=1点位
解决方案
- 第一步:先按日期列排序,保证时间序列顺序正确
- 第二步:生成触发器式的填充掩码,实现遇1开启、遇0关闭、中间保持的逻辑
- 第三步:修改
fill_between参数,使用生成的掩码作为填充判断条件,开启插值保证区间连续
完整可运行代码如下:
import pandas as pd import numpy as np # 1. 确保数据按时间升序排列 df_merge = df_merge.sort_values('OPTY_CLOSE_DATE').reset_index(drop=True) # 2. 生成触发器逻辑的填充掩码(向量化实现,处理大数据量效率更高) # 标记flag发生变化的行 df_merge['flag_change'] = df_merge['REVENUE_STATUS_FLAG'].ne(df_merge['REVENUE_STATUS_FLAG'].shift()) # 仅保留变化点的flag值,其余位置用前向填充保持状态 df_merge['fill_mask'] = df_merge['REVENUE_STATUS_FLAG'].where(df_merge['flag_change']).ffill().fillna(0).astype(bool) # 3. 绘图 ax = df_merge.plot(kind='scatter', x='OPTY_CLOSE_DATE', y='REVENUE_STATUS_FLAG') # 填充时使用生成的掩码,开启interpolate保证区间连续,填充高度固定为0到1 ax.fill_between( df_merge['OPTY_CLOSE_DATE'], 0, 1, where=df_merge['fill_mask'], alpha=0.4, interpolate=True )
如果数据量较小,也可以用更直观的循环方式生成填充掩码:
prev_state = False fill_mask = [] for flag in df_merge['REVENUE_STATUS_FLAG']: if flag == 1: prev_state = True elif flag == 0: prev_state = False fill_mask.append(prev_state) df_merge['fill_mask'] = fill_mask
内容的提问来源于stack exchange,提问作者Deke Marquardt
相关产品推荐
相关产品推荐

