填充两行之间的区域(当一条线位于另一条线下方时)

时间:2018-08-31 14:42:30

标签: 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()

enter image description here

1 个答案:

答案 0 :(得分:6)

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

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
)

enter image description here

由于您还要求一种避免拥有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()