填充2行之间的区域(当一行低于另一行时)

mic*_*hen 1 python matplotlib

运行时,显示的图形不会遮挡低于5的部分.我应该如何编辑它以覆盖整个区域?

import matplotlib.pyplot as plt

x = [1,2,3,4,5,6,7,8,9,10]
y = [4,9,1,3,6,2,4,7,6,3]
z = [5]*len(y)

plt.plot(x,y)
plt.plot(x,z)
plt.fill_between(x,y,z,where=[(y[i]<z[i]) for i in range(len(x))],facecolor='r')

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

use*_*203 6

如果您查看用于计算填充位置的理解,您会注意到它仅检查您yz列表中列出的点.但是,这些点之间也存在需要填充的区域.

文档中提到此行为:

在语义上,where通常用于y1> y2或类似的.默认情况下,定义填充区域的多边形节点将仅放置在x数组中的位置.这样的多边形无法描述靠近交叉点的上述语义.包含交叉点的x部分被简单地剪裁


你需要interpolate=True:

将interpolate设置为True将计算实际交叉点并将填充区域扩展到此点

plt.fill_between(
    x,y,z,
    where=[(y[i]<z[i]) for i in range(len(x))],
    facecolor='r',
    interpolate=True
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

由于您还要求一种避免列表的方法5,您可以使用axhline,以及将列表切换到numpy数组以便于比较:

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1,2,3,4,5,6,7,8,9,10])
y = np.array([4,9,1,3,6,2,4,7,6,3])
z = 5

plt.plot(x,y)
plt.axhline(y=z, color='orange')
plt.fill_between(x,y,z,where=y<z, facecolor='r', interpolate=True)

plt.show()
Run Code Online (Sandbox Code Playgroud)