как заполнить область между строками в matplotlib

1

Я хочу заполнить максимизированную область из приведенного ниже уравнения после построения графика в matplotlib. Испытал все возможности, но не смог заполнить нужную область.

import numpy as np
import matplotlib.pyplot as plt

A = np.linspace(0, 100, 2000)

# 3A+4B≤30

y1 = (30 - A * 3 ) /4
# 5A+6B≤60
y2 = (60 - A * 5)/6
# 1.5A+3B≤21
y3 = (21 - A * 1.5)/3.0

plt.plot(A, y1, label=r'$3A+4B\leq30$')
plt.plot(A, y2, label=r'$5A+6B\leq60$')
plt.plot(A, y3, label=r'$1.5A+3B\leq21$')


plt.xlim((0, 20))
plt.ylim((0, 15))
plt.xlabel(r'$x values$')
plt.ylabel(r'$y values$')

plt.fill_between(A, y3, where = y2<y3,color='grey', alpha=0.5)
plt.legend(bbox_to_anchor=(.80, 1), loc=2, borderaxespad=0.1)
plt.show()

хочу заполнить область максима, которая х = 2,0 и у = 6,0

  • 0
    Что вы подразумеваете под «развернутой» областью?
  • 0
    максимальная площадь - это максимальная проходная ставка.
Показать ещё 4 комментария
Теги:
matplotlib
pulp

2 ответа

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

Это одно решение, основанное на этой ссылке. Единственное отличие от связанного решения состоит в том, что для вашего случая мне пришлось использовать fill_betweenx чтобы покрыть всю ось x, общую для кривых, и переключить порядок x и Y Идея состоит в том, чтобы сначала найти точку пересечения в некотором допуске, а затем взять значения от одной кривой, лежащей слева до точки, а другой кривой - от пересечения. Я также должен был добавить дополнительный [0] в ind чтобы заставить его работать

import numpy as np
import matplotlib.pyplot as plt

A = np.linspace(0, 100, 2000)

y1 = (30 - A * 3 ) /4
y2 = (60 - A * 5)/6
y3 = (21 - A * 1.5)/3.0

plt.plot(A, y1, label=r'$3A+4B\leq30$')
plt.plot(A, y2, label=r'$5A+6B\leq60$')
plt.plot(A, y3, label=r'$1.5A+3B\leq21$')

plt.xlim((0, 20))
plt.ylim((0, 12))
plt.xlabel(r'$x values$')
plt.ylabel(r'$y values$')

plt.legend(bbox_to_anchor=(.65, 0.95), loc=2, borderaxespad=0.1)

def fill_below_intersection(x, S, Z):
    """
    fill the region below the intersection of S and Z
    """
    #find the intersection point
    ind = np.nonzero( np.absolute(S-Z)==min(np.absolute(S-Z)))[0][0]
    # compute a new curve which we will fill below
    Y = np.zeros(S.shape)
    Y[:ind] = S[:ind]  # Y is S up to the intersection
    Y[ind:] = Z[ind:]  # and Z beyond it
    plt.fill_betweenx(Y, x, facecolor='gray', alpha=0.5) # <--- Important line

fill_below_intersection(A, y3, y1)

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

  • 0
    Вы чемпион! Это именно то, что я искал. :)
0

Я предполагаю, что вы хотите заполнить область между y1 и y3 пока они не пересекаются друг с другом, потому что вы указали (2, 6) как точку? Тогда используйте:

plt.fill_between(A, y1, y3, where = y1<y3)

Аналогично замените y3 на y2 если вы имели в виду другую кривую. "Максимизированная область" немного вводит в заблуждение, как уже прокомментировал @gmds.

  • 0
    я заменил у3 на у2 и наоборот .. это не выход, что я ищу.
  • 1
    @VijayaBhaskar Тогда, возможно, вы должны указать, какой именно вывод вы ищете.
Показать ещё 2 комментария

Ещё вопросы

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