如何用Python基于Excel数据绘制曲线并计算红、绿区域曲线下面积
Python计算曲线下面积(含分区域统计)
前置依赖安装
先安装所需的Python库:
pip install numpy scipy matplotlib
1. 数据导入
假设你的6000+数据点存储在CSV文件中(第一列是横坐标x,第二列是纵坐标y),用numpy快速读取:
import numpy as np # 替换成你的数据文件路径 x, y = np.loadtxt('data_points.csv', delimiter=',', unpack=True)
2. 计算曲线下总面积
推荐用辛普森法(对平滑曲线拟合精度更高)或梯形法,借助scipy.integrate模块实现:
from scipy.integrate import trapezoid, simpson # 梯形法 total_area_trapezoid = trapezoid(y, x) # 辛普森法 total_area_simpson = simpson(y, x) print(f"梯形法总面积:{total_area_trapezoid:.2f}") print(f"辛普森法总面积:{total_area_simpson:.2f}")
3. 分区域计算红色/绿色面积
假设红色区域是曲线低于基线(比如y=0)的部分,绿色区域是曲线高于基线的部分,代码如下:
# 替换成你图中的基线值,比如0或其他拟合线 baseline = 0 # 绿色区域:曲线高于基线的部分 y_green = np.where(y > baseline, y - baseline, 0) green_area = simpson(y_green, x) # 红色区域:曲线低于基线的部分(取绝对值保证面积为正) y_red = np.where(y < baseline, baseline - y, 0) red_area = simpson(y_red, x) print(f"绿色区域面积:{green_area:.2f}") print(f"红色区域面积:{red_area:.2f}")
如果你的基线不是固定值,而是另一条曲线(比如拟合的直线),可以先拟合基线:
# 拟合线性基线(根据需求调整拟合阶数) coefficients = np.polyfit(x, y, 1) baseline_curve = np.polyval(coefficients, x) # 用基线曲线替代之前的baseline变量即可 y_green = np.where(y > baseline_curve, y - baseline_curve, 0) green_area = simpson(y_green, x)
4. 可视化验证
用matplotlib绘制曲线并填充区域,确认计算的区域是否正确:
import matplotlib.pyplot as plt plt.figure(figsize=(12, 6)) plt.plot(x, y, color='darkblue', label='原始曲线') # 绘制基线 plt.plot(x, baseline if isinstance(baseline, int) else baseline_curve, color='gray', linestyle='--', label='基线') # 填充绿色区域 plt.fill_between(x, baseline, y, where=(y > baseline), color='green', alpha=0.3, label='绿色区域') # 填充红色区域 plt.fill_between(x, y, baseline, where=(y < baseline), color='red', alpha=0.3, label='红色区域') plt.xlabel('X轴') plt.ylabel('Y轴') plt.title('曲线及分区域面积') plt.legend() plt.show()
关键提示
- 确保x数组是单调递增的,数值积分要求横坐标有序
- 辛普森法对数据点数量无严格要求,6000+数据点可以直接使用
- 如果数据有噪声,可先对y做平滑处理(比如
scipy.signal.savgol_filter)再计算面积
内容的提问来源于stack exchange,提问作者Sujith Kumar S
相关产品推荐
相关产品推荐

