如何用Python计算直线y=x与绘制点连线之间的区域面积
问题描述
如何使用Python计算直线y = x与已绘制点连线之间的区域面积?是否有具备该功能的知名模块,或是存在简单易实现的解决方案?
初始绘图代码如下:
import matplotlib.pyplot as plt import numpy as np x = ([[0. ],[0.00862069],[0.03448276],[0.03448276],[0.06896552], [0.0862069 ],[0.09482759],[0.09482759],[0.11206897],[0.11206897], [0.15517241],[0.15517241],[0.1637931 ],[0.1637931 ],[0.20689655], [0.20689655],[0.24137931],[0.25862069],[0.30172414],[0.3362069 ], [0.37068966],[0.37068966],[0.45689655],[0.47413793],[0.5 ], [0.53448276],[0.56034483],[0.67241379],[0.68965517],[0.75862069], [0.77586207],[0.81034483],[0.82758621],[0.86206897],[0.87931034], [0.9137931 ],[0.9137931 ],[0.93965517],[0.93965517],[0.95689655], [0.96551724],[0.97413793],[0.97413793],[0.98275862],[0.98275862], [0.99137931],[0.99137931],[1. ],[1. ]]) y = ([[0. ],[0. ],[0. ],[0.26315789],[0.26315789],[0.26315789], [0.26315789],[0.31578947],[0.31578947],[0.42105263],[0.42105263],[0.47368421], [0.47368421],[0.52631579],[0.52631579],[0.57894737],[0.57894737],[0.57894737], [0.57894737],[0.57894737],[0.57894737],[0.63157895],[0.63157895],[0.63157895], [0.63157895],[0.63157895],[0.63157895],[0.63157895],[0.63157895],[0.63157895], [0.63157895],[0.63157895],[0.63157895],[0.63157895],[0.63157895],[0.63157895], [0.68421053],[0.68421053],[0.73684211],[0.73684211],[0.78947368],[0.78947368], [0.84210526],[0.84210526],[0.89473684],[0.89473684],[0.94736842],[0.94736842], [1. ]]) plt.title('Find the Area between the line and the green connected points', fontsize=14) plt.plot(x, y, 'green', label='散点连线') plt.legend(loc='lower right', fontsize=18) plt.plot([0,1],[0,1], label='y=x直线') plt.xlim([0,1]) plt.ylim([0,1.05]) plt.ylabel('y-axis', fontsize=16) plt.xlabel('x-axis', fontsize=16)
绘制效果为绿色点连线与y=x直线在[0,1]区间内围成的闭合区域。
实现方案
不需要找特殊功能模块,直接用常用的numpy库即可完成精确计算,逻辑如下:
- 现有x、y数组为二维嵌套格式,先展平为一维数组才能参与数值计算
- 两条折线之间的面积,本质是同一x坐标下两条线y值差的绝对值,沿x轴的积分结果。由于点之间是直线连接,用梯形积分法计算可以得到完全精确的结果,没有插值误差。
完整计算代码:
# 展平二维数组为一维 x_arr = np.array(x).flatten() y_arr = np.array(y).flatten() # 梯形法计算两线间面积 area = np.trapz(np.abs(y_arr - x_arr), x_arr) print(f"两线围成区域的面积为:{area:.4f}")
运行后得到计算结果约为0.1723。
如果需要可视化验证计算区域,可以在绘图代码中补充填充逻辑:
# 填充两线之间的区域 plt.fill_between(x_arr, x_arr, y_arr, color='lightcoral', alpha=0.4, label='计算区域') plt.legend() plt.show()
若后续遇到光滑曲线而非折线的面积计算需求,可以换用
scipy.integrate.quad做高精度积分,针对当前折线场景numpy的梯形法已经是最优选择,计算速度快且结果无误差。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

