В оси Matlab, как обновить только данные, сохранив при этом все свойства оси?

Мне нужно создать фильм. Предположим, я создаю ось и рисую на ней что-то очень индивидуальное:

figure;
ax = plot(x, y, 'linewidth', 3, 'prop1', value1, 'prop2', value2, ...);
grid minor;
axis(ax, [xmin xmax ymin ymax]);
legend(ax, ...);
xlabel(ax, ...);
ylabel(ax, ...);
title(ax, ...);

Теперь я запускаю цикл, в котором обновляются только значения y.

for k = 1 : N
% y changes, update the axis
end

Каков самый быстрый и простой способ обновить ось новыми y (или x и y), сохранив все свойства оси?


person Serg    schedule 25.04.2012    source источник


Ответы (2)


Быстрый способ - просто обновить значения y данных, которые вы начертили:

%# note: plot returns the handle to the line, not the axes
%# ax = gca returns the handle to the axes
lineHandle = plot(x, y, 'linewidth', 3, 'prop1', value1, 'prop2', value2, ...);

%# in the loop
set(lineHandle,'ydata',newYdata)

РЕДАКТИРОВАТЬ Что делать, если линий несколько, т. е. lineHandle – это вектор? Вы по-прежнему можете выполнить обновление за один шаг; вам нужно преобразовать данные в массив ячеек.

%# make a plot with random data
lineHandle = plot(rand(12));

%# create new data
newYdata = randn(12);
newYcell = mat2cell(newYdata,12,ones(1,12));

%# set new y-data. Make sure that there is a row in 
%# newYcell for each element in lineH (i.e. that it is a n-by-1 vector
set(lineHandle,{'ydata'},newYcell(:) );
person Jonas    schedule 25.04.2012
comment
Спасибо, Джонас. Оно работает. Кстати, если y — матрица, то lineHandle — это вектор, поэтому я вызываю set(lineHandle(i),'ydata',newYdata(:,i)) для каждого столбца, верно? Или есть способ обновить все столбцы y сразу? - person Serg; 25.04.2012

Просто передайте дескриптор оси последующим командам построения графика.

i.e.

plot(ax, ...)

скорее, чем

ax = plot(...)
person learnvst    schedule 25.04.2012
comment
извините, Learnvst, но это не работает. plot(ax,...) удаляет все свойства оси - person Serg; 25.04.2012
comment
@Serg: если вы вызовете hold all перед следующей командой построения графика, вы сохраните старые свойства осей, но также и старую линию. - person Jonas; 25.04.2012
comment
@Jonas: Я знаю, но я не хочу сохранять старую линию. - person Serg; 26.04.2012