八度轴限制在绘图后变回自动

Octave axes limits change back to auto after plotting

我正在试验八度动画,但我遇到以下代码问题:

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

为什么绘制新数据后轴模式恢复为自动?

这确实是有意为之的行为。一个很好的理由是没有理由假设后续对 plot 函数的独立调用应该以某种方式相关,因此 Octave 选择适合数据的最佳表示。因此,在您的绘图策略中,对 'plot' 的调用恰好是 'related' 是无关紧要的。

如果您想在循环中保留之前的轴设置等,有多种选择。

  • 您可以按照您的建议在每次迭代结束时继续设置限制
  • 不必在每次调用 plot 时都创建一个新的轴对象,您可以 hold on 并在同一轴上绘制东西;如果您记录每个地块的句柄,则可以根据需要删除前一个,只留下最后一个显示。
  • 只绘制一次,在循环中只需替换绘图对象的 xdataydata 字段,即可更新绘图。

显然最直接的做法是第一个选项;最后一个可能是需要考虑的问题,例如,计算效率是一个问题。

制作动画的正确方法是更新 plot 创建的线条的 'XData''YData' 属性。像这样:

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))

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