2016-04-07 69 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值存在於矢量上的其他位置,則可能會出現問題。如果是這樣,您可以指定firstfind函數的其他匹配規格。

+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); 

我已經添加了控制標記的三角形大小的峯值,這應該不是一個問題自動提取和兩個變量的最大值。然後它爲每個峯值畫出三條線。

我不知道這將如何轉化爲八度。

+0

就像一個音符:peaks_max = y(峯值) – bluesceada

+0

@bluesceada true,thanks –