2016-04-07 6 views
1

関数のピークを視覚化したいと思います。より上のマーカーが表示されるようにしたいと思います。が関連付けられています。MATLAB/Octaveプロットマーカーは、ライン上ではなくラインの上にあります。

私は質問が正しくマーカーを視覚化するだけの方法です、私はすでにピークを有する最小の例を製作:

y = [0.1 0.3 10.0 1.0 0.5 0.1 24.0 0.6 0.1 0.2] 
x = (1:length(y)) 
plot(x,y); 

hold on; 

peaks = [3 7]; 
plot(x(peaks), y(peaks), 'v', 'MarkerSize', 24); 

print('-dpng', 'example.png', '-S640,480'); 

をので、結果として、マーカーは、このような行を中心に表示されます。 markers shown on the line

私が望む結果は慎重にこのようにパラメータOFFSETを調整することによって達成することができます。

plot(x(peaks), y(peaks)+OFFSET, 'v', 'MarkerSize', 24); 

次の図に示すように、この正確な例では、OFFSET=2.56はエクスポートされたpngでは機能しますが、インタラクティブなプロットやベクターグラフィックスの書き出しでは間違っています。

markers above line, as is desired

誰もが手動で裁判/エラーをやってすることなく、この結果を取得する方法をお勧めしますか?

現在、私はgnuplotでOctaveを使ってlatex + tikzにエクスポートしています。ソリューションがあればうまくいくはずです。

私の実際の(より複雑な)使用例では、同じ図形に複数の線をプロットしていて、yの制限が変わるので、オフセットは簡単に計算できません。 yの限界。

編集:さらに、semilogxプロットを使用しているため、図の中のx/y軸スケールの線が歪んで見えます。

答えて

1

小さな三角形を描くのはどうですか?

y = [0.1 0.3 10.0 1.0 0.5 0.1 24.0 0.6 0.1 0.2]; 
x = (1:length(y)); 
peaks = [3 7]; 
plot(x,y); 

hold on; line([peaks(1) peaks(1)+0.2], [y(x==peaks(1)) y(x==peaks(1))+1], 'color','b') 
hold on; line([peaks(1) peaks(1)-0.2], [y(x==peaks(1)) y(x==peaks(1))+1], 'color','b') 
hold on; line([peaks(1)+0.2 peaks(1)-0.2], [y(x==peaks(1))+1 y(x==peaks(1))+1], 'color','b') 

hold on; line([peaks(2) peaks(2)+0.2], [y(x==peaks(2)) y(x==peaks(2))+1], 'color','b') 
hold on; line([peaks(2) peaks(2)-0.2], [y(x==peaks(2)) y(x==peaks(2))+1], 'color','b') 
hold on; line([peaks(2)+0.2 peaks(2)-0.2], [y(x==peaks(2))+1 y(x==peaks(2))+1], 'color','b') 

ピークのy値がベクトル上の他の位置に存在すると問題が生じる可能性があります。その場合は、find機能に対してfirstまたは他の一致する仕様を指定することができます。

+0

少し速かった; –

+0

ちょっと... :) – Adiel

+0

これはオクターブ+ gnuplotで動作し、すでに役立っていますが、yとxの制限の変更によって三角形の縦横比が変わるようになりました。実際の使用例では、対数プロットを使用しているので、完全に歪んでいます。他のアイデア? ...編集:いいえ、私はまた、指数関数的にプロットされ、軸に応じてスケールされることができると思う、ちょっと複雑になります... – bluesceada

1

Matlabの部分については、ピークマーカーを自分で描くことができます。どこかにこれらの行(あなたの例を拡張する)に沿った:

y = [0.1 0.3 10.0 1.0 0.5 0.1 24.0 0.6 0.1 0.2] 
x = (1:length(y)) 
figure, plot(x,y); 
leglengthx=0.2; 
leglengthy=0.5; 
hold on; 

peaks = [3 7]; 
peaks_max=[10 24]; 

for ii=1:2 
    line([peaks(ii) peaks(ii)+leglengthx],[peaks_max(ii) peaks_max(ii)+leglengthy]); 
    line([peaks(ii) peaks(ii)-leglengthx],[peaks_max(ii) peaks_max(ii)+leglengthy]); 
    line([peaks(ii)-leglengthx peaks(ii)+leglengthx],[peaks_max(ii)+leglengthy peaks_max(ii)+leglengthy]); 
end 

plot(x(peaks), y(peaks), 'v', 'MarkerSize', 24); 

Iは自動的に抽出するために問題とマーカーの三角形の大きさを制御する2つの変数であってはならないれ、ピークの最大値を追加しました。そして、それはちょうどあらゆるピークのために3つの線を描きます。

これがどのようにOctaveに変換されるのかわかりません。

+0

ちょうどメモとして:peaks_max = y(ピーク) – bluesceada

+0

@ブルースセダール本当、ありがとう –

関連する問題