在不同的Windows中同时显示不断更新的图

时间:2013-12-17 21:23:29

标签: matlab user-interface plot

我正在尝试创建一个由主GUI组成的程序,该GUI可以调用多个单独的GUI来显示“实时”连续更新的不同数据。但是,似乎只能在同一时间更新单个GUI中的图。可以同时更新同一GUI中的多个轴。但是,如果打开了两个GUI,则一次只能更新单个GUI中的轴,其他GUI中的轴“保持”,直到另一个GUI停止尝试连续绘图。

作为对这个问题的一个简单测试,我创建了一个由单轴标记为'plotAxes'和一个togglebutton组成的GUI。当togglebutton被“压下”时,使用代码在轴上连续绘制随机数据:

xData = linspace(1,20,20);
while(get(hObject,'Value'))
    yData = rand(20,1);
    plot(handles.plotAxes,xData,yData);
    drawnow;
end

将'gui_Singleton'参数设置为0,我打开了这个GUI的两个实例。如果我切换GUI A开始绘图,则在轴上显示连续的随机数据。如果我然后将GUI B切换到绘图,则GUI A中的显示保持在最后一帧,并且GUI B开始显示连续的随机数据。当我取消切换GUI B绘图按钮时,GUI A将恢复连续绘图。

有没有办法让单独的GUI窗口中的轴同时更新?我尝试使用'batch'命令在不同的工作程序上运行GUI,但是在通过'batch'启动时不显示GUI(我怀疑'批处理'不适用于任何与图形相关的内容)。

2 个答案:

答案 0 :(得分:2)

从计时器对象运行绘图函数。这将使您保持两个轴的逻辑分离:每个轴一个计时器。请参阅help timer,并将TimerFcn属性设置为计时器到期时要运行的函数。

for ii=1:2
  figure; ax(ii) = gca;
  tim(ii) = timer;
  tim(ii).ExecutionMode = 'fixedRate';
  tim(ii).Period = 0.5;

  % A timer callback function needs at least two parameters.
  % x,y are dummy parameters to make the function call happy,
  % but we will ignore the values
  tim(ii).TimerFcn = @(x,y)(plot(ax(ii), rand(10,3)));

  start(tim(ii));
end

编辑: 我忘了提到计时器对象可以存储在GUI数据结构中,而切换按钮回调只需要启动和停止计时器。

答案 1 :(得分:1)

您需要从单个线程控制轴:

figure;ax(1) = gca;
figure;ax(2) = gca;

while all(ishandle(ax))
    plot(ax(1),rand(10,3));
    plot(ax(2),rand(10,3));
    drawnow
end

这将在两个轴上绘制,直到您关闭其中一个数字。