尝试解决MATLAB绘图闪烁问题

4

我在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

如果我这样做,那么figure(1)将非常平滑地显示x,而不会在绘图之间“闪烁”,但现在我无法显示figure(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个回答

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


谢谢Geodesic。你能详细解释一下drawnow到底是在做什么吗?我读了文档,但仍然不确定它到底在做什么。谢谢! - Spacey
本质上,它是强制Matlab在代码执行的那一点更新图形窗口。如果您从此循环中删除drawnow命令,则会看到您的两个轴上确实有输出,但最可能只会看到p = 100的值(而不是for循环中每组值)。可能您的计算机运行此示例太快,以至于您无法看到此内容。将p更改为1:1000或1:10000,您应该知道我的意思。 - Geodesic
Geodesic,感谢您的回答,但是有一个细节正在成为问题,尽管我认为它不会。我已经相应地编辑了问题。 - Spacey
是的,没错 - imagesc 不喜欢直接使用轴句柄。我已相应地编辑了我的答案。 - Geodesic

1

对于 p = 1,使用 plot 命令或者 imagesc 命令创建所需绘图。通过获取输出参数来保留结果图形对象的句柄,例如 h = plot(.... 或者 h = imagesc(....。这将是一个 Handle Graphics 的 lineseries 或者 image 对象,具体取决于您创建的特定绘图类型。

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

如果需要,在更新后调用 drawnow 强制刷新图形队列。


谢谢,这个方法非常有效。我理解一旦'h = imagesc(zeros(10,10))'被创建,'cdata'就会被设置为10x10的大小。至少看起来是这样的。如果图像大小不同,我无法使用imagesc函数。不管怎样,这不是问题,只是我观察到的一个现象。 - Spacey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接