Octave 打印后倍频程轴限制将更改回自动

Octave 打印后倍频程轴限制将更改回自动,octave,axes,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') paus

我正在试验倍频程动画,以下代码有问题:

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时创建一个新的Axis对象不同,您可以在同一个轴上按住并绘制对象;如果为每个绘图保留句柄记录,则可以根据需要删除上一个,只显示最后一个。 只打印一次,在循环中只需替换打印对象的扩展数据和ydata字段,即可更新打印。
显然,最简单的方法是第一种选择;如果计算效率是一个问题,那么最后一个问题可能需要考虑。

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

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

您可以按照您的建议,在每次迭代结束时继续设置限制 与每次调用plot时创建一个新的Axis对象不同,您可以在同一个轴上按住并绘制对象;如果为每个绘图保留句柄记录,则可以根据需要删除上一个,只显示最后一个。 只打印一次,在循环中只需替换打印对象的扩展数据和ydata字段,即可更新打印。
显然,最简单的方法是第一种选择;如果计算效率是一个问题,那么最后一个可能是要考虑的问题。

< P>制作动画的正确方法是更新由情节创建的线条的“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))

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

制作动画的正确方法是更新由plot创建的线的“扩展数据”和“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))

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

实际上,只要不重置循环内的轴限制,就可以绕过它?@CrisLuengo真的吗?必须是新的,据我所知,这已经是默认行为了一段时间了…@Tasos:对不起,我看错了代码,我以为那里有一个暂停。你是对的,这里的绘图应该重置轴。事实上,除了重置循环内的轴限制外,无论如何绕过它?@CrisLuengo真的吗?必须是新的,据我所知,这已经是默认行为了一段时间了…@Tasos:对不起,我看错了代码,我以为那里有一个暂停。你是对的,这里的绘图应该重置轴。如果我将轴设置为手动,你确定是这样吗?根据mathworks的回答:建议使用xlim和ylim命令来固定绘图之间的轴,OP随后发现这仍然不起作用,在相关问题中,建议将轴设置为手动。我将轴设置为手动,我不认为它应该更改回去,因为我在相同的轴上绘制了更多的数据。@Tim:您没有在相同的轴上绘制更多的数据。添加保留以将数据添加到相同的轴。此外,对于动画,您最好更改绘制的线的YData属性,而不是在旧值上绘制更新的值。是的,我不能只使用“保持”,因为我不想看到每个绘图-好的,我将更新数据。出于兴趣,手动和自动有什么用?如果任何新的绘图重置了模式,那么为什么能够更改模式?我不需要更改为手动来设置限制OK,我知道,我没有意识到每个绘图都会创建一个新的轴。@Tim:当您使用“保持”添加一条线时;绘图…,除非模式设置为手动,否则限制将调整为包括所有绘图数据。如果保留默认值,则“绘图”将清除轴并重置其所有属性,与删除轴并创建新轴几乎相同,只是保留了句柄。如果
我已将轴设置为手动?根据mathworks的回答:建议使用xlim和ylim命令来固定绘图之间的轴,OP随后发现这仍然不起作用,在相关问题中,建议将轴设置为手动。我将轴设置为手动,我不认为它应该更改回去,因为我在相同的轴上绘制了更多的数据。@Tim:您没有在相同的轴上绘制更多的数据。添加保留以将数据添加到相同的轴。此外,对于动画,您最好更改绘制的线的YData属性,而不是在旧值上绘制更新的值。是的,我不能只使用“保持”,因为我不想看到每个绘图-好的,我将更新数据。出于兴趣,手动和自动有什么用?如果任何新的绘图重置了模式,那么为什么能够更改模式?我不需要更改为手动来设置限制OK,我知道,我没有意识到每个绘图都会创建一个新的轴。@Tim:当您使用“保持”添加一条线时;绘图…,除非模式设置为手动,否则限制将调整为包括所有绘图数据。如果保留默认值,则“打印”将清除轴并重置其所有属性,与删除轴并创建新轴几乎相同,只是保留了控制柄。