Когда это выполняется, отображаемый график не затеняет некоторые части, которые ниже 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()
Если вы посмотрите на понимание, которое вы используете, чтобы рассчитать, где заполнить, вы заметите, что он проверяет только точки, перечисленные в ваших списках y
и z
. Тем не менее, есть области между теми точками, которые необходимо заполнить.
Такое поведение указано в документации:
Семантически,
where
часто используется для y1> y2 или аналогично. По умолчанию узлы многоугольника, определяющие заполненную область, будут помещаться только в позиции в массиве 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
)
Так как вы также попросили axhline
список из 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()