在 Matlab 中,如何从曲线画线到特定的 xaxis 位置?

Posted

技术标签:

【中文标题】在 Matlab 中,如何从曲线画线到特定的 xaxis 位置?【英文标题】:In Matlab, how to draw lines from the curve to specific xaxis position? 【发布时间】:2017-01-14 06:26:35 【问题描述】:

我有一个光谱数据(x 轴上的 1000 个变量,峰值强度为 y)和一个在不同特定 x 位置(称为峰值的矩阵)处感兴趣的峰值列表,这是我从我制作的函数中获得的。在这里,我想从每个峰的最大值到 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

【问题讨论】:

您的代码不起作用。请参阅:minimal reproducible example。 您是否尝试过使用findpeaks 亲爱的 EBH,findpeaks 准确地提出了我想要获得的功能,但我没有 Matlab 信号处理工具箱。这就是为什么我在这里尝试制作自定义代码的原因。到目前为止我可以找到峰值,现在我只需要在适当的位置标记它们,最终像 findpeaks 一样画线。感谢您的帮助。 如果您已经有了峰值,那么this answer 可能会有所帮助。如果你在那里找到你需要的东西,我可以根据你的情况重写它。 【参考方案1】:

简单注释:

下面是注释峰的简单方法:

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

其中xy 是您的数据,x_peaky_peak 是您要注释的峰的坐标。 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');

结果:


行注释:

这有点复杂,因为我们需要为每一行设置 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

结果:


箭头注释:

如果你真的想要那些箭头,那么你需要首先将峰值位置转换为标准化的数字单位。这里如何做到这一点:

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

结果:

【讨论】:

尊敬的EBH,非常感谢,您不仅回答了我的问题,还涵盖了多种注释,非常感谢!

以上是关于在 Matlab 中,如何从曲线画线到特定的 xaxis 位置?的主要内容,如果未能解决你的问题,请参考以下文章

matlab 设置曲线颜色

matlab在其中一幅图上画线怎么画如图所示

matlab 在特定曲线之间画阴影,急急急!!!!

R ggplot2从点到y = 0画线

android 使用canvas画线,如何保证快速画出圆滑的曲线?

Matlab用plot如何分别设置多条线宽?