Обновление графика Matlab с несколькими линиями / кривыми данных

Я хочу обновить график с несколькими линиями данных / кривыми как можно быстрее. Я видел какой-то метод обновления графика, например:

h = plot(x,y);
set(h,'YDataSource','y')
set(h,'XDataSource','x')
refreshdata(h,'caller');

или же

set(h,'XData',x,'YData',y);

Для одной кривой это прекрасно работает, однако я хочу обновить не одну, а несколько кривых данных. Как я могу это сделать?

2 ответа

Решение

Если вы создаете несколько объектов графика с одним plot команда, дескриптор возвращается plot на самом деле массив объектов графика (по одному на каждый график).

plots = plot(rand(2));
size(plots)

    1   2

Из-за этого вы не можете просто назначить другую матрицу [2x2] XData,

set(plots, 'XData', rand(2))

Вы можете передать массив ячеек новых XData на графики с помощью следующего синтаксиса. Это очень удобно, только если у вас уже есть новые значения в массиве ячеек.

set(plots, {'XData'}, {rand(1,2); rand(1,2)})

Другие варианты - обновить каждый объект графика индивидуально новыми значениями. Если сделать это быстро, на самом деле не так уж много снижается производительность, если вы не устанавливаете их все сразу, потому что они не будут отображаться до тех пор, пока MATLAB не будет простаивать или вы явно не вызовете drawnow,

X = rand(2);
Y = rand(2);

for k = 1:numel(plots)
    set(plots(k), 'XData', X(k,:), 'YData', Y(k,:))
end

% Force the rendering *after* you update all data
drawnow

Если вы действительно хотите использовать XDataSource а также YDataSource метод, который вы показали, вы действительно можете сделать это, но вам нужно будет указать уникальный источник данных для каждого объекта графика.

% Do this when you create the plots
for k = 1:numel(plots)
    set(plots(k), 'XDataSource', sprintf('X(%d,:)', k), ...
                  'YDataSource', sprintf('Y(%d,:)', k))
end

% Now update the plot data
X = rand(2);
Y = rand(2);

refreshdata(plots)

Ты можешь использовать drawnow:

%Creation of the vectors

x = 1:100;
y = rand(1,100);

%1st plot 
h = plot(x,y);

pause(2);

%update y
y = rand(1,100);
set(h,'YData',y)
%update the plot.
drawnow
Другие вопросы по тегам