В Matlab, как рисовать линии от кривой до определенной позиции по оси x?

У меня есть спектральные данные (1000 переменных по оси x и интенсивность пиков по оси 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

person Community    schedule 14.01.2017    source источник
comment
Ваш код не работает. См.: минимально воспроизводимый пример.   -  person excaza    schedule 14.01.2017
comment
Пробовали ли вы использовать findpeaks?   -  person EBH    schedule 15.01.2017
comment
Уважаемый EBH, findpeaks предлагает именно те функции, которые я хотел бы получить, но у меня нет набора инструментов для обработки сигналов Matlab. Вот почему я пытаюсь создать собственный код здесь. Я мог найти пик до сих пор, теперь мне просто нужно пометить их в нужном месте, в конце концов нарисовать линию, как в findpeaks. Спасибо за вашу помощь.   -  person    schedule 16.01.2017
comment
Если у вас уже есть пики, чем этот ответ может быть полезен. Если вы найдете там то, что вам нужно, я могу переписать это для вашего случая.   -  person EBH    schedule 17.01.2017


Ответы (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


Аннотация со стрелкой:

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

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

person EBH    schedule 18.01.2017
comment
Уважаемый EBH, Большое спасибо, вы не только дали ответ на мой вопрос, но и рассмотрели несколько видов аннотаций, большое спасибо! - person ; 20.01.2017