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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:48:02