3

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

4

2 回答 2

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没有。在这种特殊情况下,您需要发送一个属性名称/值对作为参数。生成的图像的“父级”将是我们的轴atwo(见上文)。

于 2012-12-05T03:34:59.697 回答
1

对于p= 1,使用plot命令或imagesc命令创建您需要的图。通过获取输出参数来保留生成的图形对象的句柄:例如h = plot(....or h = imagesc(....。这将是一个句柄图形lineseriesimage对象,或其他东西,具体取决于您创建的特定绘图类型。

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

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

于 2012-12-05T17:19:24.967 回答