首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Matlab中,如何从曲线到特定的X轴位置绘制直线?

在Matlab中,如何从曲线到特定的X轴位置绘制直线?
EN

Stack Overflow用户
提问于 2017-01-14 06:26:35
回答 1查看 396关注 0票数 1

我有一个光谱数据(在x轴上有1000个变量,峰值强度为y),以及我从一个函数中得到的各个特定x位置的感兴趣峰的列表(一个称为峰值的矩阵)。在这里,我想画一条线,从每个山峰的最大值到X轴--或者,最终,在每个山峰上方放置一个垂直箭头--但我读到它很麻烦,所以只需要一条垂直线是受欢迎的。但是,使用下面的代码,我得到了“使用行值必须是数字类型的向量的错误”。有什么想法吗?

代码语言:javascript
代码运行次数:0
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-18 19:47:35

简单注释:

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

代码语言:javascript
代码运行次数:0
运行
复制
plot(x,y,x_peak,y_peak+0.1,'v','MarkerFaceColor','r');

其中xy是您的数据,x_peaky_peak是要注释的峰值的坐标。添加0.1只是为了更好地放置注释,应该根据您的数据进行校准。

例如(带有一些任意数据):

代码语言:javascript
代码运行次数:0
运行
复制
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与以前一样:

代码语言:javascript
代码运行次数:0
运行
复制
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

其结果是:

箭头注释:

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

代码语言:javascript
代码运行次数:0
运行
复制
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

其结果是:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41647411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档