Matplotlib fill_between填充x轴区间显示为细线的原因及解决方法
问题原因
fill_between的默认填充逻辑是:只有相邻两个数据点的where判定结果同时为True时,才会填充两点之间的区域,不会自动延伸填充到你指定的边界数值。
你的时间戳是毫秒级整数值,采样点之间存在固定时间间隔:
- 当p2设为1643237119999时,这个值刚好落在两个相邻采样点的时间戳之间,没有任何原始采样点的时间戳等于该值。最后一个满足
<=1643237119999条件的采样点,它的下一个邻点时间戳已经超过p2、where判定为False,两点之间的区域不会被填充,最终仅在最后一个满足条件的单点位置渲染出极细的竖线。 - 当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
相关产品推荐
相关产品推荐

