绘制数字而不将它们带入前景

时间:2017-12-30 11:58:47

标签: matlab matlab-figure

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)会导致这种行为,但我如何在不将窗口置于前景的情况下绘制这些数字?

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:2)

相关部分可以在包含输入ax的{​​{3}}部分找到:

  

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