所以我在MATLAB中有一个简单的循环,它执行以下操作:
for p = 1:100
x = 4.*randn(1,100);
y = 7.*randn(1,100);
figure(1)
plot(randn(1,100));
figure(2);
plot(randn(1,100));
end
x和y是合成的,但这是它的最后一个。无论如何,当我运行这段代码时,毫不奇怪,MATLAB会生成两个数字并相应地绘制。问题是,当我这样做的时候,我会在数字之间"眨眼",这会使看到x和y随时间演变的质量变差。
我发现了一种让其中一个情节更流畅的方法:
figure(1);
for p = 1:100
x = 4.*randn(1,100);
y = 7.*randn(1,100);
plot(randn(1,100));
drawnow
end
如果我这样做的话,那么图(1)当然会非常平滑地绘制,很好地显示x,而不会在图之间"闪烁",但现在我无法显示图(2)或y!
如何在不"闪烁"的情况下,在不同图形(而非子图形)上平滑地绘制这两个量?
编辑:
感谢Geodesic的回答,解决方案是有效的,但有一个微妙的问题,我不认为会是一个问题,无论它是什么。
1) 我无法在此解决方案中使用"imagesc"。
例如,
figure(1);
aone = axes;
figure(2);
atwo = axes;
for p = 1:100
x = 4.*randn(1,100);
y = 7.*rand(10,100);
plot(aone,x);
drawnow;
imagesc(atwo,y);
drawnow;
end
在这种情况下,带有imagesc(atwo,y)的部件崩溃。
你的闪烁是因为你通过循环一次又一次地生成每个图形窗口,这迫使窗口每次都出现在前台。首先生成数字,将一些轴连接到它们上,并将数据绘制到每个轴上,如下所示:
figure(1);
aone = axes;
figure(2);
atwo = axes;
for p = 1:100
x = 4.*randn(1,100);
y = 7.*randn(1,100);
plot(aone,randn(1,100));
drawnow;
imagesc(y,'Parent',atwo);
drawnow;
end
Edit:像plot
这样的函数直接接受轴参数,但imagesc
不接受。在这种特殊情况下,您需要将属性名称/值对作为参数发送进来。生成的图像的"父"将是我们的轴atwo
(见上文)。
对于p
=1,使用plot
命令或imagesc
命令创建所需的绘图。通过获取一个输出参数来保留生成的图形对象的句柄:例如h = plot(....
或h = imagesc(....
。这将是一个Handle Graphicslineseries
或image
对象,或其他对象,具体取决于您创建的特定打印类型。
对于p
=2:100,不要直接使用打印命令,而是更新原始Handle Graphics对象h
的相关Data
属性。例如,对于由plot
命令生成的lineseries
对象,将其XData
和YData
属性设置为新数据。对于由imagesc
命令生成的image
对象,将其CData
属性设置为新图像。
如有必要,在更新后调用drawnow
以强制刷新图形队列。