2016-08-08 3 views
-1

필자는 x 축과 y 축에 해당하는 두 개의 열을 가지고 있는데, 결국 그래프와 같은 커브로 그 데이터 세트를 그래프로 나타낼 것입니다.
2 점의 데이터 포인트에서 가장 높은 피크 곡선 고려하기

문제는 데이터 포인트의 특성에 따라 데이터를 그래프로 작성할 때 두 개의 피크를 갖게되지만 그래프를 생성하고 가장 낮은 피크를 버릴 때 최고 피크만을 선택하려고합니다 (최고점이지만 전체 최고봉이 그래프로 나타남).

파이썬에서 그렇게 할 거리가 있습니까? 코딩을하는 방법을 모르기 때문에 여기에 코드를 표시하지 않습니다.

그래프는 물론 데이터 포인트 (입력)도 있습니다!

enter image description here

enter image description here

+0

"그래프를 작성하고 가장 낮은 피크를 버릴 때 가장 높은 피크 만 선택"은 무엇을 의미합니까? 그래프에서 가장 높은 피크를 찾았습니다. 당신이하고 싶은 다음 단계는 정확히 무엇입니까? –

+0

입력은 데이터 포인트 세트 (x, y)입니다. 그래프를 보면 여러 개의 피크가 나타납니다. 그러나 그래프에만 단일 피크와 가장 높은 피크, 즉 출력이 무엇인지, 데이터 포인트에서 가장 높은 피크 그래프가 있으면 좋겠어요! 감사합니다 – aBiologist

+0

얻은 플롯의 스크린 샷을 첨부 할 수 있습니까? 적절한 데이터/출력이 없으면 문제를 재현하는 것이 실제로 불가능합니다. –

답변

1

당신은 모든 피크를 얻을 수 scipy argrelextrema를 사용하여 최대를 해결 한 다음 플롯 할 피크 마스크 배열을 구축 할 수 있습니다. 플롯 코드 : 이것은 별도의 피크를 결정하는 것을 해결하기 위해 mincutoff 같은 것들을 사용하여 데이터를 기준으로하면 결과는 다음입니다

import numpy as np 
from scipy.signal import argrelextrema 
import matplotlib.pyplot as plt 

#Setup and plot data 
fig, ax = plt.subplots(1,2) 
y = np.array([0,0,0,0,0,6.14,7.04,5.6,0,0,0,0,0,0,0,0,0,0,0,16.58,60.06,99.58,100,50,0.,0.,0.]) 
x = np.linspace(3.92,161,y.size) 
ax[0].plot(x,y) 

#get peaks 
peaks_indx = argrelextrema(y, np.greater)[0] 
peaks = y[peaks_indx] 
ax[0].plot(x[peaks_indx],y[peaks_indx],'o') 

#Get maxpeak 
maxpeak = 0. 
for p in peaks_indx: 
    print(p) 
    if y[p] > maxpeak: 
     maxpeak = y[p] 
     maxpeak_indx = p 

#Get mask of data around maxpeak to plot 
mincutoff = 0. 
indx_to_plot = np.zeros(y.size, dtype=bool) 
for i in range(maxpeak_indx): 
    if y[maxpeak_indx-i] > mincutoff: 
     indx_to_plot[maxpeak_indx-i] = True 
    else: 
     indx_to_plot[maxpeak_indx-i] = True 
     break 

for i in range(y.size-maxpeak_indx): 
    if y[maxpeak_indx+i] > mincutoff: 
     indx_to_plot[maxpeak_indx+i] = True 
    else: 
     indx_to_plot[maxpeak_indx+i] = True 
     break 
ax[1].plot(x[indx_to_plot],y[indx_to_plot]) 
plt.show() 

,

enter image description here

UPDATE를 완벽하게 제어 할 줄 것이다 오직 가장 큰 피크. 난 아직도 알고리즘이 제대로 작동하기 위해 두 피크 음모를 꾸미고 제안

import numpy as np 
from scipy.signal import argrelextrema 
import matplotlib.pyplot as plt 

#Setup and plot data 
y = np.array([0,0,0,0,0,6.14,7.04,5.6,0,0,0,0,0,0, 
       0,0,0,0,0,16.58,60.06,99.58,100,50,0.,0.,0.]) 
x = np.linspace(3.92,161,y.size) 

#get peaks 
peaks_indx = argrelextrema(y, np.greater)[0] 
peaks = y[peaks_indx] 

#Get maxpeak 
maxpeak = 0. 
for p in peaks_indx: 
    print(p) 
    if y[p] > maxpeak: 
     maxpeak = y[p] 
     maxpeak_indx = p 

#Get mask of data around maxpeak to plot 
mincutoff = 0. 
indx_to_plot = np.zeros(y.size, dtype=bool) 
for i in range(maxpeak_indx): 
    if y[maxpeak_indx-i] > mincutoff: 
     indx_to_plot[maxpeak_indx-i] = True 
    else: 
     indx_to_plot[maxpeak_indx-i] = True 
     break 

for i in range(y.size-maxpeak_indx): 
    if y[maxpeak_indx+i] > mincutoff: 
     indx_to_plot[maxpeak_indx+i] = True 
    else: 
     indx_to_plot[maxpeak_indx+i] = True 
     break 

#Plot just the highest peak 
plt.plot(x[indx_to_plot],y[indx_to_plot]) 
plt.show() 

... 난 당신이 임의의 피크를 식별 항상 아마 지저분한 데이터 사소한 아니라고 찾을 것이라 생각합니다.

+0

감사합니다. 왜 두 번째 그림이 y 대신 y = 0에서 시작하지 않고 17에서 시작합니까? – aBiologist

+0

'mincutoff = 0.'보다 큰 if 조건의 결과 일뿐입니다. 플롯에 첫 번째 0 값을 추가하도록 변경했습니다. 실제로, 나는 mincutoff에서 멈추는 것이 가장 좋습니다 그래서 데이터가 항상 깨끗하게 0으로 가지 않을 것이라고 가정합니다. –

+0

감사합니다. 어떻게 그래프의 표시를 제어 할 수 있습니까? 두 개의 그래프가 표시된다는 것을 의미합니다. 어떻게 오른쪽 그래프 그래프 만 표시 할 수 있습니까? – aBiologist