2017-01-14 12 views
1

私は、私が作った関数から得た様々な特定のx位置(ピークと呼ばれる行列)でスペクトルデータ(xaxisに1000の変数とピーク強度をyとして)と関心のあるピークのリストを持っています。ここでは、各ピークの最大値からx軸に線を引いたり、最終的に各ピークの上に垂直矢印を描いていきたいと思いますが、それはかなり面倒です。しかし、次のコードを使用して、私は "行を使用しているエラー値は数値型のベクトルでなければなりません"と表示されます。何かご意見は?Matlabでは、カーブから特定のx軸位置に線を引く方法は?

X = spectra; 
[Peak,intensity]=PeakDetection(X); 
nrow = length(Peak); 
Peak2=Peak; % to put inside the real xaxis value 
plot(xaxis,X); 
hold on 
for i = 1 : nbrow 
     Peak2(:,i) = round(xaxis(:,i)); % to get the real xaxis value and round it 
     xline = Peak2(:,i); 
     line('XData',xline,'YData',X,'Color','red','LineWidth',2); 
end 
hold off 
+1

あなたのコードが機能しません。参照:[mcve]。 – excaza

+0

['findpeaks'](http://www.mathworks.com/help/signal/ref/findpeaks.html)を使ってみましたか? – EBH

+0

EBHの皆様、findpeaksは私が入手したい機能を正確に提案していますが、MATLAB Signal処理ツールボックスはありません。だからここでカスタムコードを作ろうとしているのです。私はこれまでのところピークを見つけることができましたが、今は適切な場所にラベルを付けるだけで、最終的にfindpeaks.Asのように線を描く必要があります。 –

答えて

1

シンプル注釈:ここで

がピークに注釈を付けるための簡単な方法です:

xyがあなたのデータであり、 x_peaky_peakは座標である
plot(x,y,x_peak,y_peak+0.1,'v','MarkerFaceColor','r'); 

注釈を付けるピーク。 0.1の追加は注釈の配置を改善するためのもので、データ用に調整する必要があります。例えば
(いくつかの任意のデータを持つ):

x = 1:1000; 
y = sin(0.01*x).*cos(0.05*x); 
[y_peak,x_peak] = PeakDetection(y); % this is just a sketch based on your code... 
plot(x,y,x_peak,y_peak+0.1,'v','MarkerFaceColor','r'); 

結果:

peaks1


ライン注釈:

これは少し複雑です各行に4つの値が必要なためです。ここでも、x_peaky_peak前などを想定して:

plot(x,y); 
hold on 
ax = gca; 
ymin = ax.YLim(1); 
plot([x_peak;x_peak],[ymin*ones(1,numel(y_peak));y_peak],'r') 
% you could write instead: 
% line([x_peak;x_peak],[ymin*ones(1,numel(y_peak));y_peak],'Color','r') 
% but I prefer the PLOT function. 
hold off 

と結果:

peaks2


アロー注釈:

をあなたは本当にあなたがして、これらの矢印をしたい場合最初にピーク位置を正規化された図Uに変換する必要がありますニット。ここではそれを行う方法:

plot(x,y); 
ylim([-1.5 1.5]) % only for a better look of the arrows 
peaks = [x_peak.' y_peak.']; 
ax = gca; 
% This prat converts the axis unites to the figure normalized unites 
% AX is a handle to the figure 
% PEAKS is a n-by-2 matrix, where the first column is the x values and the 
% second is the y values 
pos = ax.Position; 
% NORMPEAKS is a matrix in the same size of PEAKS, but with all the values 
% converted to normalized units 
normpx = pos(3)*((peaks(:,1)-ax.XLim(1))./range(ax.XLim))+ pos(1); 
normpy = pos(4)*((peaks(:,2)-ax.YLim(1))./range(ax.YLim))+ pos(2); 
normpeaks = [normpx normpy]; 
for k = 1:size(normpeaks,1) 
    annotation('arrow',[normpeaks(k,1) normpeaks(k,1)],... 
     [normpeaks(k,2)+0.1 normpeaks(k,2)],... 
     'Color','red','LineWidth',2) 
end 

と結果:

peaks3

+1

親愛なるEBH、ありがとう、ありがとう、私の質問への答えを提供しただけでなく、いくつかの種類の注釈もカバーしました、ありがとう! –

関連する問題