Заполните область между 2 линиями (когда одна находится ниже другой)

1

Когда это выполняется, отображаемый график не затеняет некоторые части, которые ниже 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()

Изображение 174551

Теги:
matplotlib

1 ответ

6
Лучший ответ

Если вы посмотрите на понимание, которое вы используете, чтобы рассчитать, где заполнить, вы заметите, что он проверяет только точки, перечисленные в ваших списках 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
)

Изображение 174551

Так как вы также попросили 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()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню