Пределы октавных осей возвращаются к автоматическим после построения - PullRequest
0 голосов
/ 27 сентября 2018

Я экспериментирую с октавной анимацией, и у меня проблема со следующим кодом:

clear
x = 0:pi/1000:2*pi;
y = sin(x);
y2 = sin(2*x);
y3 = sin(3*x);
figure
xlim("manual");
ylim("manual");
xlim([0 2*pi]);
ylim([-1 1]);
tic
for i = 1:2000
  xlim ("mode")
  plot(x(i),y(i),'b',x(i),y2(i),'r',x(i),y3(i),'g')
  pause(1)
end
toc

На выходе я получаю:

ans = manual
ans = auto
ans = auto
ans = auto
ans = auto

Почему режим оси возвращается кавто после вывода новых данных?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Правильный способ создания анимации - обновить свойства 'XData' и 'YData' строки, созданной plot.Примерно так:

x = 0:pi/1000:2*pi;
y = sin(x);
y2 = sin(2*x);
y3 = sin(3*x);
cla
h = plot(x(1),y(1),'b',x(1),y2(1),'r',x(1),y3(1),'g');
xlim([0 2*pi]);
ylim([-1 1]);
for i = 2:2000
  set(h(1),'XData',x(i),'YData',y(i))
  set(h(2),'XData',x(i),'YData',y2(i))
  set(h(3),'XData',x(i),'YData',y3(i))
  pause(0.01)
end

Если вы хотите сохранить предыдущие точки, вы можете изменить команды set следующим образом:

set(h(1),'XData',x(1:i),'YData',y(1:i))

Таким образом, добавляется новая точкавместо перемещения существующей точки.

0 голосов
/ 28 сентября 2018

Это действительно предполагаемое поведение.Хорошим обоснованием для этого является то, что нет никаких оснований предполагать, что последующие независимые вызовы функции plot должны быть каким-то образом связаны, поэтому октава выбирает наилучшее возможное представление, которое соответствует данным.Поэтому тот факт, что вызовы «plot» в вашем случае в вашей стратегии построения графиков оказываются «связанными», не имеет значения.

Если вы хотите сохранить в цикле настройки предыдущей оси и т. Д., Есть несколько вариантов.

  • Вы можете просто продолжать устанавливать ограничения в конце каждой итерации, предлагая
  • Вместо того, чтобы создавать новый объект осей каждый раз, когда вы вызываете plot, вы можете hold on и наносить вещи на одни и те же оси;если вы сохраняете запись дескриптора для каждого графика, вы можете при необходимости удалить предыдущий, оставив только последний из них.
  • График только один раз, и в вашем цикле просто замените xdata объекта графика на графике.ydata полей, чтобы обновить свой сюжет.

Очевидно, что наиболее простой способ сделать это - первый вариант;последний может быть чем-то, что следует учитывать, если, например, вычислительная эффективность является проблемой.

...