Matlab 在不将人物带到前景的情况下绘制人物

Matlab 在不将人物带到前景的情况下绘制人物,matlab,matlab-figure,Matlab,Matlab Figure,在我的脚本中,我有多个图形,它们将在一个循环中更新。脚本运行时,必须显示图形。不幸的是,当前更新的图形总是出现在前台,这使得无法监视某个图形。我知道调用图(1)和图(2)会导致这种行为,但我如何才能绘制这些图形,不将窗口置于前台?正如mikkola在评论中建议的那样,您可以指定向哪个轴添加数据点。但是,有一种更好的方法:创建一个单行对象,并更新其xdata和ydata属性。这不仅更快,而且内存效率更高。您的代码将变成: figure; ax1 = axes; figure; ax2 = axes

在我的脚本中,我有多个图形,它们将在一个循环中更新。脚本运行时,必须显示图形。不幸的是,当前更新的图形总是出现在前台,这使得无法监视某个图形。我知道调用
图(1)
图(2)
会导致这种行为,但我如何才能绘制这些图形,不将窗口置于前台?

正如mikkola在评论中建议的那样,您可以指定向哪个轴添加数据点。但是,有一种更好的方法:创建一个单行对象,并更新其
xdata
ydata
属性。这不仅更快,而且内存效率更高。您的代码将变成:

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
在使用MatlabHandle图形时,我保留了一套经验法则。这些都与这个问题有关:

  • 使用
    figure
    仅用于创建新的地物,或将现有地物放在最前面(通常您希望避免使用,但有时是必要的)

  • 始终通过保留和使用图形或轴的控制柄来指定要使用的图形或轴。我从不依赖于
    gcf
    gca
    (既不明确也不含蓄)。在命令行上键入时,使用当前图形很有用,但在脚本或函数中,真正的危险在于有人在函数执行时随机单击windows。创建一个窗口,然后写入
    gcf
    ,最终可能会写入一个不同的图形(实际上,我一直在随机点击)

  • 不要创建过多的对象。为绘制的每个点创建一个新的
    线
    对象是浪费


另外请注意,
plot(…'o')
等同于
scatter(…)
,除非为每个点指定不同的颜色或大小。但是使用点大小或颜色来指定附加信息并不是传达该信息的好方法。如果您有兴趣通过图表了解有效沟通,请阅读。

相关部分可在包含输入的部分中找到:

scatter(ax,__;)
绘制到由
ax
指定的轴,而不是绘制到 当前轴

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

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

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

您可以尝试
scatter(ax1,x,y,'MarkerEdgeColor','red')
来指定应该使用的轴,而不调用
figure
。哦,我没有想到这一点。非常好用,谢谢!我刚刚偶然发现了
set(0,'CurrentFigure',)
,但你的想法可能会更好。@mikkola你应该回答这个问题,这是一个好办法。更好的办法是更新行的
xdata
ydata
属性
h=plot(0,0,…)
,然后在循环内部
h.xdata=[h.xdata,x]
,对于y也是如此。这是最快的方法,如果你有很多点要绘制,那么会占用更少的内存。答案很好!只有一个澄清-
图(…'o')
散点图不完全相同,它们采用不同的输入
plot
允许您在一次调用中输入多个系列的数据(作为矩阵中的列),而
scatter
一次只获取一个系列。
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