绘制后八度轴极限会变回自动

时间:2018-09-27 16:56:07

标签: octave axes

我正在尝试八度动画,但是以下代码存在问题:

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 :(得分:2)

这确实是预期的行为。这样做的一个很好的理由是,没有理由假设对绘图函数的后续独立调用应该以某种方式关联,因此,八度选择适合数据的最佳表示形式。因此,在您的绘图策略中对您的案例中的“绘图”调用恰好是“相关的”事实。

如果要在循环中保留先前的轴设置等,则有几个选项。

  • 您可以按照建议在每次迭代结束时简单地设置限制
  • 您可以hold on并在相同的轴上绘制事物,而不是每次调用图都创建一个新的轴对象。如果您保留每个图的句柄记录,则可以根据需要删除前一个图。仅显示最后一个图。
  • 仅绘制一次,并且在循环内只需替换打印对象的xdataydata字段即可更新您的绘图。

显然,最简单的方法是第一种选择;如果例如计算效率成为问题,则可能要考虑最后一个。

答案 1 :(得分:2)

制作动画的正确方法是更新'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))

这样,将添加一个新点,而不是移动现有点。