2017-01-14 12 views
1

У меня есть спектральные данные (1000 переменных на xaxis и интенсивности пиков как y) и список интересующих пиков в разных конкретных местах x (матрица под названием Peak), которую я получил от сделанной мной функции. Здесь я хотел бы нарисовать линию от максимального значения каждого пика до xaxis - или, в конце концов, поместить вертикальную стрелку над каждым пиком, но я прочитал, что это довольно хлопотно, так что только вертикальная линия приветствуется. Однако, используя следующий код, я получаю «Ошибка использования строки Значение должно быть вектором числового типа». Есть предположения?В Matlab, как рисовать линии от кривой до определенной позиции xaxis?

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

Ваш код не работает. См.: [Mcve]. – excaza

+0

Вы пытались использовать ['findpeaks'] (http://www.mathworks.com/help/signal/ref/findpeaks.html)? – EBH

+0

Уважаемые EBH, findpeaks предлагают именно те функции, которые я хотел бы получить, но у меня нет инструментария обработки Matlab Signal. Вот почему я пытаюсь создать собственный код здесь. Я мог бы найти пик до сих пор, теперь мне просто нужно пометить их в нужном месте, в конце концов нарисуйте линию, как в findpeaks. Спасибо за вашу помощь. –

ответ

1

Простая аннотация:

Вот простой способ аннотировать пики:

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

где x и y ваши данные, и x_peak и y_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'); 

результат:

peaks1


Линия аннотация:

Это просто немного сложнее потому что нам нужно 4 значения для каждой строки. Опять же, при условии, x_peak и y_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 

и результат:

peaks2


Arrow аннотация:

Если вы действительно хотите, чтобы эти стрелки, то вы необходимо сначала преобразовать местоположение пика в нормированное число u нит. Вот как это сделать:

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 

и результат:

peaks3

+1

Уважаемый EBH, Большое спасибо, вы не только дали ответ на мой вопрос, но и рассмотрели несколько видов аннотаций, большое спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^