【问题标题】:Plot to figures without bringing them into foreground绘制图形而不将它们置于前景
【发布时间】:2018-01-29 13:35:55
【问题描述】:
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) 的调用会导致这种行为,但我怎样才能绘制这些数字,而不将窗口置于前台?

【问题讨论】:

  • 您可以尝试scatter(ax1, x,y, 'MarkerEdgeColor', 'red') 指定应该使用的轴,而根本不调用figure
  • 哦,我没想到。完美运行,谢谢!我只是偶然发现了set(0,'CurrentFigure',<handle of figure>),但你的想法可能会更好。
  • @mikkola 你应该回答这个问题,这是要走的路。
  • 更好的方法是更新该行的xdataydata 属性。 h=plot(0,0,...),然后在循环 h.xdata = [h.xdata,x] 内,对于 y 也是如此。这是最快的方法,如果你有很多点要绘制,将使用更少的内存。

标签: matlab matlab-figure


【解决方案1】:

正如 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"

【讨论】:

  • 不错的答案!只有一个澄清 - plot(... 'o') 不完全像 scatter,他们假设不同的输入。 plot 允许您在一次调用中输入多个数据系列(作为矩阵中的列),而 scatter 一次只输入一个系列。
【解决方案2】:

相关部分可以在documentation of scatter中包含输入ax的部分找到:

scatter(ax,___) 绘制到由ax 指定的轴上,而不是绘制到 当前坐标区。

这允许用户指定一个轴句柄,指向应该使用哪些轴来绘制散点图。因此,如果您在代码中跳过使用 figure 并改用 ax 输入,则可以避免与 figure 相关的“放在前面”行为。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 2011-03-14
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多