Автоматический ответ
Учитывая набор значений x
и y
, а также набор peaks
(x
-координат пиков), вот как вы можете автоматически найти область под каждым из пиков. Я предполагаю, что x
, y
и peaks
являются массивами Numpy:
import numpy as np
# find the minima between each peak
ixpeak = x.searchsorted(peaks)
ixmin = np.array([np.argmin(i) for i in np.split(y, ixpeak)])
ixmin[1:] += ixpeak
mins = x[ixmin]
# split up the x and y values based on those minima
xsplit = np.split(x, ixmin[1:-1])
ysplit = np.split(y, ixmin[1:-1])
# find the areas under each peak
areas = [np.trapz(ys, xs) for xs,ys in zip(xsplit, ysplit)]
Выход:
![enter image description here](https://i.stack.imgur.com/KpUyx.png)
Пример данных был настроен таким образом, чтобы площадь под каждым пиком (более или менее) гарантированно составляла 1.0
, поэтому результаты на нижнем графике верны. Зеленые метки X - это места минимума между каждыми двумя пиками. Часть кривой, «принадлежащая» каждому пику, определяется как часть кривой между минимумами, примыкающими к каждому пику.
Полный код
Вот полный код, который я использовал для генерации данных примера:
import scipy as sp
import scipy.stats
prec = 1e5
n = 10
N = 150
r = np.arange(0, N+1, N//n)
# generate some reasonable fake data
peaks = np.array([np.random.uniform(s, e) for s,e in zip(r[:-1], r[1:])])
x = np.linspace(0, N + n, num=int(prec))
y = np.max([sp.stats.norm.pdf(x, loc=p, scale=.4) for p in peaks], axis=0)
и код, который я использовал для построения графиков:
import matplotlib.pyplot as plt
# plotting stuff
plt.figure(figsize=(5,7))
plt.subplots_adjust(hspace=.33)
plt.subplot(211)
plt.plot(x, y, label='trace 0')
plt.plot(peaks, y[ixpeak], '+', c='red', ms=10, label='peaks')
plt.plot(mins, y[ixmin], 'x', c='green', ms=10, label='mins')
plt.xlabel('dep')
plt.ylabel('indep')
plt.title('Example data')
plt.ylim(-.1, 1.6)
plt.legend()
plt.subplot(212)
plt.bar(np.arange(len(areas)), areas)
plt.xlabel('Peak number')
plt.ylabel('Area under peak')
plt.title('Area under the peaks of trace 0')
plt.show()