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()
逻辑说明
- 前两个
fill_between语句确保0-1之间的区域完全被覆盖,不管y是大于1、小于0还是在0-1之间,都不会留下空白。 - 后两个语句专门处理超出0-1范围的部分:y>1时补填1到y的区域,y<0时补填y到0的区域,结合
interpolate=True保证跨越边界时过渡平滑。
内容的提问来源于stack exchange,提问作者Jawis
相关产品推荐
相关产品推荐

