不将图形置于前景即可绘制图形。

3
figure;
ax1 = axes;
figure;
ax2 = axes;
x = 0; y = 0;
while ishandle(ax1) && ishandle(ax2)
    x = x + 1;
    y = y + 1;
      figure(1)
      scatter(x,y, 'MarkerEdgeColor', 'red')
      hold on
      figure(2)
      scatter(x,y, 'MarkerEdgeColor', 'blue')
      hold on
  end

在我的脚本中,我有多个图形,这些图形将在循环中更新。在脚本运行时必须显示这些图形。不幸的是,当前更新的图形总是弹出到前景,这使得监视某个图形变得不可能。我知道调用figure(1)figure(2)会导致这种行为,但我该如何绘制这些图形,而不将窗口带到前台?


4
你可以尝试使用scatter(ax1, x,y, 'MarkerEdgeColor', 'red')指定应该使用的轴,而不需要调用figure。请注意,不要改变原始含义,并使翻译更加通俗易懂。 - mikkola
哦,我没有考虑到那个。非常完美,谢谢!我刚刚偶然发现了 set(0,'CurrentFigure',<handle of figure>),但是你的想法可能更好。 - wheeler
@mikkola,你应该把它作为答案,这是正确的方法。 - Robert Seifert
更好的方法是更新线条的xdataydata属性。在循环内部,先定义h=plot(0,0,...),然后执行h.xdata = [h.xdata,x]以及类似的操作来更新y值。这是最快的方法,如果你需要绘制许多点,则会使用更少的内存。 - Cris Luengo
2个回答

5

正如mikkola在评论中建议的那样,您可以指定scatterplot将数据点添加到哪个轴上。但是,有一种更好的方法:创建一个单独的线对象,并更新其xdataydata属性。这既更快,也更节省内存。你的代码将变成:

x = 0; y = 0;
figure;
h1 = plot(x,y,'ro');
figure;
h2 = plot(x,y,'bo');
while ishandle(h1) && ishandle(h2)
   x = x + 1;
   y = y + 1;
   h1.XData(end+1) = x;
   h1.YData(end+1) = y;
   h2.XData(end+1) = x;
   h2.YData(end+1) = y;
   drawnow
   pause(0.1)
end

我在使用MATLAB的句柄图形时,有一套经验法则。以下内容与本问题相关:

  • 仅使用 figure 创建新图形,或将现有图形置于前景(通常要避免,但有时是必要的)。

  • 始终通过保留和使用它们的句柄来指定要使用的图形或轴。我从不依赖于 gcfgca (无论是显式还是隐式)。在命令行上输入时使用当前图形是有用的,但在脚本或函数中执行时,真正危险的是有人在函数执行过程中随意点击窗口。创建窗口然后写入 gcf 可能会写入不同的图形(我总是随意点击的)。

  • 不要创建不必要的对象。为每个点创建新的 line 对象是浪费的。

此外注意,plot(...'o')scatter(...) 相当,除非您为每个点指定不同的颜色或大小。但是使用点的大小或颜色来指定其他信息不是传达该信息的好方法。如果您有兴趣学习通过图表进行有效沟通,请阅读 Tufte's "The visual display of quantitative information"


2
很好的回答!只有一个澄清 - plot(... 'o') 不完全像 scatter,它们假设不同的输入。plot 允许您在一次调用中输入多个数据系列(作为矩阵中的列),而 scatter 一次只接受一个系列。 - EBH

2
相关部分可以在包含输入axscatter函数文档中找到:

scatter(ax,___)会绘制到由ax指定的坐标系中,而不是当前坐标系。

这允许用户指定一个指向应用于绘制散点图的坐标系的轴句柄。因此,如果您在代码中跳过使用figure并改用ax输入,则可以避免与figure相关的"bring to front"行为。

您可以按照以下方式修改您的代码:

figure;
ax1 = axes;
figure;
ax2 = axes;
x = 0; y = 0;
while ishandle(ax1) && ishandle(ax2)
    x = x + 1;
    y = y + 1;
    scatter(ax1, x,y, 'MarkerEdgeColor', 'red')
    hold on
    scatter(ax2, x,y, 'MarkerEdgeColor', 'blue')
    hold on
end

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