Мой код:

import matplotlib.pyplot as plt
import numpy as np

# x > 0
x = np.linspace(0,17, 100)
#x2>=0
y0 = (x*0)
#-x1+x2 <= 1
y1 = 1+x
#x1+6x2 <= 15
y2 = 15/6 - (1/6)*x
#4x1-x2 <= 10
y3 = 4*x-10

plt.xlabel(r'$x_2>=0$')
plt.ylabel(r'$x_1>=0$')

plt.plot(x,y0,'r')
plt.plot(x,y1, 'b')
plt.plot(x,y2, 'y')
plt.plot(x,y3, 'g')
plt.xlim((0,17))
plt.ylim((0,9))

#feasible region
a1 = np.minimum(y2,y3)
a2 = np.minimum(y1,y2)
plt.fill_between(x, y1, y3, where = a1 < a2, color = 'grey', alpha = 0.5)

Это генерирует следующий сюжет:

graph

Однако я не хочу, чтобы серый цвет выходил за желтую линию, т.е. я хочу удалить серый цвет, расположенный внутри треугольника над четырехсторонним многоугольником. Это означает, что я хочу, чтобы значения, которые превышают желтую линию, также были удалены, но я не уверен, как это представить, не добавляя еще один аргумент в where. Я получаю ошибки только при попытке сделать это. Есть ли способ указать несколько аргументов для where?

Изменить: я решил проблему, настроив свои параметры на:

#feasible region
a1 = np.maximum(y0,y3)
a2 = np.minimum(y1,y2)
plt.fill_between(x, a1, a2, where = a1 < a2, color = 'grey', alpha = 0.5)

Однако мне все еще интересно, как можно указать несколько аргументов для where, поэтому я оставлю вопрос.

3
hkj447 15 Сен 2020 в 05:32

1 ответ

Лучший ответ

Вы можете использовать np.maxiumum и np.minimum для определения значений y. Таким образом, вам не нужно "кусать" это. Используйте maximum на ваших нижних границах, чтобы определить только одну нижнюю границу для построения. То же самое с minimum и вашими верхними границами. Кроме того, в вашем примере вы обрезаете ось y, где на самом деле есть заштрихованная область ниже.

Y1 = np.maximum(y0, y3)
Y2 = np.minimum(y1, y2)
plt.fill_between(x, Y1, Y2, where = Y1 < Y2, color = 'grey', alpha = 0.5)

enter image description here

1
busybear 15 Сен 2020 в 02:43