所以我在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,没有图(1)'在图之间'闪烁',但现在我不能显示图(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)的部分崩溃。
答案 0 :(得分:9)
你的闪烁是因为你在循环中一次又一次地生成每个图形窗口,这就迫使窗口每次都出现在前台。首先生成图形,将一些轴附加到它们上,然后将数据绘制到每个轴上,如下所示:
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
编辑:像plot
这样的函数直接采用轴参数,但imagesc
没有。在这种特殊情况下,您需要将一个Property Name / Value对作为参数发送。生成的图像的“父级”将是我们的轴atwo
(见上文)。
答案 1 :(得分:1)
对于p
= 1,使用plot
命令或imagesc
命令创建所需的图。通过获取输出参数来保留结果图形对象的句柄:例如h = plot(....
或h = imagesc(....
。这将是Handle Graphics lineseries
或image
对象或其他内容,具体取决于您创建的特定绘图类型。
对于p
= 2:100,不要直接使用绘图命令,而是更新原始Handle Graphics对象Data
的相关h
属性。例如,对于lineseries
命令生成的plot
对象,请将其XData
和YData
属性设置为新数据。对于image
命令生成的imagesc
对象,请将其CData
属性设置为新图像。
如有必要,请在更新后调用drawnow
以强制刷新图形队列。