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

Matplotlib fill_between填充x轴区间显示为细线的原因及解决方法

问题原因

fill_between的默认填充逻辑是:只有相邻两个数据点的where判定结果同时为True时,才会填充两点之间的区域,不会自动延伸填充到你指定的边界数值。
你的时间戳是毫秒级整数值,采样点之间存在固定时间间隔:

  1. 当p2设为1643237119999时,这个值刚好落在两个相邻采样点的时间戳之间,没有任何原始采样点的时间戳等于该值。最后一个满足<=1643237119999条件的采样点,它的下一个邻点时间戳已经超过p2、where判定为False,两点之间的区域不会被填充,最终仅在最后一个满足条件的单点位置渲染出极细的竖线。
  2. 当p2设为1643237120000时,该值刚好匹配到下一个采样点的时间戳,相邻两点都满足where条件,两点之间的区域会被正常填充,因此能看到连续的填充面。
修复方案

最简便的修复方式是给fill_between加上interpolate=True参数,该参数会让matplotlib在where条件跳变的边界位置自动做插值计算,跨边界完成填充,不需要你指定的区间端点刚好落在原始采样点上。

修复后的代码如下:

fig, ax = plt.subplots()
p1 = 1643237118161
p2 = 1643237119999
ax.plot(df_gpsprobe.timestamp, df_gpsprobe.speed, 'ro-')
ax.fill_between(
    df_gpsprobe.timestamp, 
    df_gpsprobe.speed, 
    0, 
    where=(df_gpsprobe.timestamp >= p1) & (df_gpsprobe.timestamp <= p2), 
    color='g',
    interpolate=True # 新增该参数处理边界插值
)
plt.xlabel('timestamp (ms)')
plt.ylabel('speed (m/s)')
plt.show()

如果加参数后仍有边界偏差,可以先通过plt.xlim(p1, p2)放大x轴对应区间,检查原始采样点的分布,确认p1、p2的取值符合你的填充预期。

效果对比

  • p2=1643237119999(未修复):填充区域显示为极细竖线,无连续填充面
  • p2=1643237120000/加interpolate=True修复后:指定区间内显示连续的绿色填充区域

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:27:51