numpy 如何在Python中对图形上两条曲线之间的区域进行着色

5t7ly7z5  于 2023-08-05  发布在  Python
关注(0)|答案(1)|浏览(124)

我有两个函数,分别代表边际消减成本(MAC)和边际损害成本(MD),如下所示:

def MAC(E):
    return 750 - E

def MD(E):
    return 0.5 * E

字符串
我想创建一个图表,在同一图上显示MAC和MD曲线。此外,我想在两条曲线之间的MAC成本高于0但低于250的区域加上阴影,并且排放水平(E)在0和大约750之间变化。
我尝试使用Matplotlib中的fill_between函数,但阴影没有按预期显示。我如何在图中的MAC和MD曲线之间适当地着色该区域?
代码样本:

import numpy as np
import matplotlib.pyplot as plt

def MAC(E):
    return 750 - E

def MD(E):
    return 0.5 * E

# Generate values for E from 0 to 1000
E_values = np.linspace(0, 1000, 100)

# Calculate MAC and MD values for each E value
MAC_values = MAC(E_values)
MD_values = MD(E_values)

# Plot MAC and MD on the same graph
plt.plot(E_values, MAC_values, label='MAC', color='blue')
plt.plot(E_values, MD_values, label='MD', color='red')

# Add labels and a legend
plt.xlabel('Emission Level (E)')
plt.ylabel('Cost')
plt.legend()

# Add a title to the graph
plt.title('Marginal Abatement Cost (MAC) and Marginal Damage Cost (MD)')

# Shade the region between MAC and MD curves where MAC is higher than 0 and lower than 250
plt.fill_between(E_values, MAC_values, MD_values, where=(MAC_values >= 0) & (MAC_values <= 250), color='lightblue', alpha=0.5)

# Show the graph
plt.grid(True)
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.legend()
plt.show()

预期输出:

代码应该生成一个具有MAC和MD两条曲线的图,并且两条曲线之间的MAC成本高于0但低于250的区域应该用浅蓝色着色。发射水平(E)应在X轴上在0和大约750之间变化。蓝色圆圈区域是我想要着色的地方:


的数据

nkhmeac6

nkhmeac61#

您的代码不起作用,因为where参数仅用于限制左右范围。
对于fill_between,顶部以MAC_valuesMD_values或250中的最小值为界。要进行这种比较,可以使用np.minimum.reduce,它将对所有数组执行按元素的比较(相当于堆叠它们并在其中一个轴上执行min)。

top = np.minimum.reduce([MAC_values,
                         MD_values,
                         np.ones_like(MAC_values)*250])
# equivalent
# top = np.min(np.stack([MAC_values,
#                        MD_values,
#                        np.ones_like(MAC_values), axis=0)
plt.fill_between(x=E_values, y1=top, y2=0, 
                 where=(E_values >= 0) & (E_values <= 750),
                 color='lightblue', alpha=0.5)

字符串


的数据
注意:在这种情况下,您可以只考虑MAC_valuesMD_values,因为在可接受的E_values范围内,它们不会超过250,但我给了您一个更一般的问题的代码。如果这个条件永远为真,你可以这样做:

top = np.minimum(MAC_values, MD_values)


或者,等价地:

top = np.stack([MAC_values, MD_values], axis=0)


更新:通过使用where参数简化了代码。

相关问题