You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:22:30