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

Matplotlib fill_between函数绘图出现空白区域的问题求助

问题分析与解决

空白原因

x=24附近的空白出现在y值从小于1跨越到大于1的过渡段(x=24对应y=0.9595,x=25对应y=1.00002)。原代码的where条件拆分过细,导致交点右侧的0-1区域没有被任何填充语句覆盖:

  • 当y从小于1跳到大于1时,cond=(y>=0 & y<=1)在x=24为True,x=25为False,interpolate=True会计算出y=1的交点,但原代码中没有针对「交点右侧、y>1时的0-1区域」的填充逻辑,导致这部分留白。

修复方案

重新梳理填充逻辑,确保所有区域都被覆盖:

  • 所有位置的0到min(y,1)区域用C0填充
  • 所有位置的max(y,0)到1区域用C2填充
  • 额外处理y>1时的1到y区域(补C0)和y<0时的y到0区域(补C2)

修改后的代码如下:

import numpy as np
import matplotlib.pyplot as plt

y_list=[0.35328659,  0.97313739,  0.98385365, -0.97960526, 
0.98658943,  0.97615343,
          0.97539618,  0.97751352,  0.96911883,  0.96291649,  0.9493149,   0.93523555,
          0.94011452,  0.91881423,  0.90835381,  0.88725635 , 0.89163797,  0.87300867,
          0.87035654,  0.87672802,  0.85594486 , 0.88945495,  0.94530403,  0.96636498,
          0.95950467,  1.00002651 , 1.0254289 ,  0.02018627 , 1.03353243,  1.01131321] 

y=np.array(y_list)
x=np.arange(len(y_list))  # 改用numpy数组,避免range的类型问题

fig, ax = plt.subplots(figsize=(30,5))

# 填充0到min(y,1)的区域(所有位置都覆盖)
ax.fill_between(x, 0, np.minimum(y, 1), color='C0', alpha=0.3)
# 填充max(y,0)到1的区域(所有位置都覆盖)
ax.fill_between(x, np.maximum(y, 0), 1, color='C2', alpha=0.3)
# 额外填充y>1时,1到y的部分
ax.fill_between(x, 1, y, where=(y>1), color='C0', alpha=0.3, interpolate=True)
# 额外填充y<0时,y到0的部分
ax.fill_between(x, y, 0, where=(y<0), color='C2', alpha=0.3, interpolate=True)

ax.margins(x=0, y=0) 
plt.show()

逻辑说明

  1. 前两个fill_between语句确保0-1之间的区域完全被覆盖,不管y是大于1、小于0还是在0-1之间,都不会留下空白。
  2. 后两个语句专门处理超出0-1范围的部分:y>1时补填1到y的区域,y<0时补填y到0的区域,结合interpolate=True保证跨越边界时过渡平滑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:46:19