运行此命令时,显示的图形不会遮盖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()
答案 0 :(得分:6)
如果您查看用于计算要填充的位置的理解,您会注意到它仅检查y
和z
列表中列出的点。但是,在这些点之间的区域也需要填充。
in the documentation中提到了此行为:
在语义上,
where
通常用于y1> y2或类似值。默认情况下,定义填充区域的面的节点将仅放置在x数组中的位置。这样的多边形无法在相交附近描述上述语义。包含相交的x截面被简单地剪切
您需要interpolate=True
:
将插值设置为True将计算实际的交点,并将填充区域扩展到该点
plt.fill_between(
x,y,z,
where=[(y[i]<z[i]) for i in range(len(x))],
facecolor='r',
interpolate=True
)
由于您还要求一种避免拥有5
列表的方法,因此可以改用axhline
,也可以将列表切换到numpy
数组以方便比较:< / p>
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()