【问题标题】:fill between more than two curves matplotlib在多于两条曲线 matplotlib 之间填充
【发布时间】:2020-09-15 15:11:45
【问题描述】:

我想在以下问题的 3 行之间填写。代码如下:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Construct lines
# x > 0
x = np.linspace(0, 20, 2000)
# C1
y1 = (36-2*x)/6
# C2
y2 = (30-5*x)/3
# C3
y3 = (40-8*x)/2
# C4
# y4 = 0*x

# Make plot
plt.plot(x, y1, label=r'$2 x_{1} + 6 x_{2}\leq 36$')
plt.plot(x, y2, label=r'$x_{1} + 3 x_{2}\leq 30$')
plt.plot(x, y3, label=r'$x_{1} + 2 x_{2}\leq 40$')
# plt.plot(x, y4, label=r'$x_{1}, x_{2}\geq 0$')
plt.xlim((0, 16))
plt.ylim((0, 11))
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')

# Fill feasible region
y5 = np.minimum(0, 0)
y6 = np.maximum(y2, y3)
plt.fill_between(x, y1, y2, color='grey', alpha=0.5,
                interpolate=True)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

我想填充下图中红色阴影部分(y1、y2、y3 和零之间)

【问题讨论】:

标签: python matplotlib


【解决方案1】:

您可以在三条曲线的零和最小值之间填充:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 2000)
y1 = (36 - 2 * x) / 6
y2 = (30 - 5 * x) / 3
y3 = (40 - 8 * x) / 2

plt.plot(x, y1, label=r'$2 x_{1} + 6 x_{2}\leq 36$')
plt.plot(x, y2, label=r'$x_{1} + 3 x_{2}\leq 30$')
plt.plot(x, y3, label=r'$x_{1} + 2 x_{2}\leq 40$')
plt.xlim((0, 16))
plt.ylim((0, 11))
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')

plt.fill_between(x, y1, y2, color='grey', alpha=0.5,
                 interpolate=True)
plt.fill_between(x, 0, np.min([y1, y2, y3], axis=0), color='red', alpha=0.5, hatch='//',
                 interpolate=True, label='$intersection$')
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.tight_layout()
plt.show()

【讨论】:

    【解决方案2】:

    注意:

    1. np.vstack([y1, y2, y3]) 从您的 3 个“y”数组中创建一个 3 行数组。

    2. ….min(0) 沿每一列计算最小值,所以实际上是 至少 3 个源数组(对于更高的 x 也有负值)。

    3. ….clip(min=0)将上面的负数元素转化为0

    所以添加到您的代码中:

    plt.fill_between(x, 0, np.vstack([y1, y2, y3]).min(0).clip(min=0),
        color='yellow', alpha=0.5, interpolate=True)
    

    例如在您的第一个 fill_between 之后。

    对于您的数据,以及添加了上述指令的代码,我得到了:

    如果您愿意,可以将填充颜色更改为适合您需要的颜色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-02
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 2021-07-12
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多