如何在Python中为MAC与MD曲线间指定区域添加阴影
解决Matplotlib填充MAC与MD曲线指定区域的问题
你的问题出在fill_between的条件逻辑和参数设置上,以下是修正后的完整方案:
问题分析
根据你的MAC函数MAC(E)=750-E,MAC值在0-250对应的排放水平E是500到750(计算:750-E=250 → E=500;750-E=0 → E=750)。原代码的where条件虽然限制了MAC的范围,但缺少对曲线相交处的插值处理,导致填充区域可能出现缺口或不符合预期的范围。
修正后的代码
import numpy as np import matplotlib.pyplot as plt def MAC(E): return 750 - E def MD(E): return 0.5 * E # 生成E值,范围限定在0到750即可,超出部分MAC为负无意义 E_values = np.linspace(0, 750, 200) # 增加采样点让曲线更平滑 MAC_values = MAC(E_values) MD_values = MD(E_values) # 绘制曲线 plt.plot(E_values, MAC_values, label='MAC', color='blue') plt.plot(E_values, MD_values, label='MD', color='red') # 设置图表标签与标题 plt.xlabel('Emission Level (E)') plt.ylabel('Cost') plt.title('Marginal Abatement Cost (MAC) and Marginal Damage Cost (MD)') # 填充指定区域:MAC在0-250之间,且取两条曲线的上下边界 plt.fill_between( E_values, MAC_values, MD_values, where=(MAC_values >= 0) & (MAC_values <= 250), interpolate=True, # 自动处理曲线交点处的填充,避免缺口 color='lightblue', alpha=0.5 ) # 美化图表 plt.grid(True, alpha=0.3) plt.axhline(0, color='black', linewidth=0.5) plt.axvline(0, color='black', linewidth=0.5) plt.legend() plt.show()
关键修改点
- 缩小E的取值范围:只生成0到750的E值,因为E>750时MAC为负,不符合需求中的MAC≥0条件,减少不必要的计算。
- 添加
interpolate=True:当两条曲线相交时(E=500处MAC=MD=250),该参数会自动插值填充交点附近的区域,避免出现填充缺口。 - 优化采样点数量:把
linspace的采样点从100增加到200,让曲线和填充区域更平滑。
效果说明
修正后会在E=500到750之间,填充MD曲线(上方)与MAC曲线(下方)之间的浅蓝色区域,完全符合你要求的“MAC成本0到250、E在0至约750之间”的范围(实际有效E范围是500-750,因为0-500时MAC>250,不在需求范围内)。
内容的提问来源于stack exchange,提问作者Bosser445
相关产品推荐
相关产品推荐

