试图让MATLAB的数字停止闪烁'

时间:2012-12-05 02:51:12

标签: matlab user-interface graphics matlab-figure

所以我在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)的部分崩溃。

2 个答案:

答案 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 lineseriesimage对象或其他内容,具体取决于您创建的特定绘图类型。

对于p = 2:100,不要直接使用绘图命令,而是更新原始Handle Graphics对象Data的相关h属性。例如,对于lineseries命令生成的plot对象,请将其XDataYData属性设置为新数据。对于image命令生成的imagesc对象,请将其CData属性设置为新图像。

如有必要,请在更新后调用drawnow以强制刷新图形队列。