我有两个函数,分别代表边际消减成本(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之间变化。蓝色圆圈区域是我想要着色的地方:
的数据
1条答案
按热度按时间nkhmeac61#
您的代码不起作用,因为
where
参数仅用于限制左右范围。对于
fill_between
,顶部以MAC_values
、MD_values
或250中的最小值为界。要进行这种比较,可以使用np.minimum.reduce
,它将对所有数组执行按元素的比较(相当于堆叠它们并在其中一个轴上执行min)。字符串
的数据
注意:在这种情况下,您可以只考虑
MAC_values
和MD_values
,因为在可接受的E_values
范围内,它们不会超过250,但我给了您一个更一般的问题的代码。如果这个条件永远为真,你可以这样做:型
或者,等价地:
型
更新:通过使用
where
参数简化了代码。