运行时,显示的图形不会遮挡低于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)
如果您查看用于计算填充位置的理解,您会注意到它仅检查您y
和z
列表中列出的点.但是,这些点之间也存在需要填充的区域.
在语义上,
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)