whe*_*ler 3 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
Run Code Online (Sandbox Code Playgroud)
在我的脚本中,我有多个数字,这些数字将在循环中更新.脚本运行时必须显示数字.不幸的是,当前更新的数字总是在前景中弹出,这使得无法监视某个数字.我理解调用figure(1)并figure(2)导致这种行为,但我怎么能在不将窗口置于前景的情况下绘制这些数字?
正如mikkola在评论中建议的那样,您可以指定哪些轴scatter或plot添加数据点.然而,有一个更好的方法,包括:建立一个单一的线对象,并更新其xdata和ydata性质.这既快又更节省内存.您的代码将变为:
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
Run Code Online (Sandbox Code Playgroud)
在使用MATLAB处理图形时,我保留了一套经验法则.这些与这个问题有关:
使用figure只创建一个新的人物,或者把现有的身影向前方(要避免一般,但有时是必要的).
始终通过保持和使用其手柄来指定您想要使用哪个或哪些轴.我从不依赖gcf或gca(不明确或暗示).在命令行上键入时使用当前数字非常有用,但在脚本或函数中存在真正的危险,而不是在执行函数时有人在窗口上随机单击.创建一个窗口然后写入gcf可能最终写入不同的图形(实际上,我一直点击随机的东西).
不要创建超出必要的对象.line为您绘制的每个点创建一个新对象都是浪费.
另请注意,除非您为每个点指定不同的颜色或大小,否则plot(...'o')相当于此scatter(...).但是使用点大小或颜色来指定附加信息并不是传达该信息的好方法.如果您有兴趣了解通过图表进行有效沟通,请阅读Tufte的"量化信息的视觉显示".