In Matlab, how to draw lines from the curve to specific xaxis position?

匿名 (未验证) 提交于 2019-12-03 02:33:02

问题:

I have a spectral data (1000 variables on xaxis, and peak intensities as y) and a list of peaks of interest at various specific x locations (a matrix called Peak) which I obtained from a function I made. Here, I would like to draw a line from the maximum value of each peaks to the xaxis - or, eventually, place a vertical arrow above each peaks but I read it is quite troublesome, so just a vertical line is welcome. However, using the following code, I get "Error using line Value must be a vector of numeric type". Any thoughts?

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:

Simple annotation:

Here is a simple way to annotate the peaks:

plot(x,y,x_peak,y_peak+0.1,'v','MarkerFaceColor','r'); 

where x and y is your data, and x_peak and y_peak is the coordinates of the peaks you want to annotate. The add of 0.1 is just for a better placing of the annotation and should be calibrated for your data.
For example (with some arbitrary data):

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

the result:


Line annotation:

This is just a little bit more complicated because we need 4 values for each line. Again, assuming x_peak and y_peak as before:

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 

and the result:


Arrow annotation:

If you really want those arrows, then you need to first convert the peak location to the normalized figure units. Here how to do that:

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 

and the result:



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!