八度轴限制在绘图后变回自动
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
并在同一轴上绘制东西;如果您记录每个地块的句柄,则可以根据需要删除前一个,只留下最后一个显示。
- 只绘制一次,在循环中只需替换绘图对象的
xdata
和 ydata
字段,即可更新绘图。
显然最直接的做法是第一个选项;最后一个可能是需要考虑的问题,例如,计算效率是一个问题。
制作动画的正确方法是更新 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))
这样,添加了一个新点,而不是移动现有点。
我正在试验八度动画,但我遇到以下代码问题:
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
并在同一轴上绘制东西;如果您记录每个地块的句柄,则可以根据需要删除前一个,只留下最后一个显示。 - 只绘制一次,在循环中只需替换绘图对象的
xdata
和ydata
字段,即可更新绘图。
显然最直接的做法是第一个选项;最后一个可能是需要考虑的问题,例如,计算效率是一个问题。
制作动画的正确方法是更新 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))
这样,添加了一个新点,而不是移动现有点。