我有两个数字列表,xs和ys:
xs = [2, 5, 4]
ys = [6, 7, 8]
并使用matplotlib库绘制它们:
import matplotlib.pyplot as plt
plt.plot(xs, ys, 'bo')
现在,我想计算绘图下的面积。我尝试了excel方法:
sum = 0
for i in range(1, len(xs)):
y = ys[i] + ys[i - 1]
x = xs[i] - xs[i - 1]
sum = sum + (y/2 * x)
,但答案并非总是正确的。然后尝试这个:
from sklearn.metrics import auc
print('computed AUC using sklearn.metrics.auc: {}'.format(auc(xs,ys)))
,但不适用于未排序的xs。那么我该如何计算情节下的面积呢?
答案 0 :(得分:2)
您的积分公式似乎对离散点正确。我无法理解您想要曲线下的面积的方法。顺便说一句,它是在x轴上未排序的,是从点[0]到点[1]的线下面积,然后从点[1]到点[2]的面积减去。如果是您的情况,那么它确实有效。
如果您希望它们位于所有3点正下方的区域,我将对xs进行排序。如果您想要曲线下的面积,即使考虑到它本身是双背的,我也会在for循环中采用x的绝对值。 abs()
如果您希望曲线下的面积不重复计算点[1]和点[2]之间的面积。我会写,
import matplotlib.pyplot as plt
xs = [2, 5, 4]
x_sort = sorted(xs)
ys = [6, 7, 8]
sum = 0
plt.plot(xs, ys, 'bo')
plt.show()
for i in range(1, len(xs)):
slope = (xs[i]-xs[i-1])/(ys[i] - ys[i-1])
delta_x = x_sort[i] - x_sort[i - 1]
delta_y = ys[i - 1] + (ys[i-1] + delta_x * slope)
sum = sum + (delta_y/2 * delta_x)
print(sum)
这将采用未排序点之间的斜率并将其应用于排序后的值之间,如果按[xs,ys]对的顺序连接线,则会为您提供图形正下方的区域。
我希望这有助于回答您的问题。