【问题标题】:Displaying Constantly Updating Plots Simultaneously in Different Windows在不同窗口中同时显示不断更新的绘图
【发布时间】:2013-12-17 21:23:29
【问题描述】:

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

作为对这个问题的一个简单测试,我创建了一个 GUI,其中包含一个标记为“plotAxes”的轴和一个切换按钮。当切换按钮被“按下”时,使用代码在轴上连续绘制随机数据:

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 窗口中的坐标轴同时更新?我尝试使用“批处理”命令在单独的工作人员上运行 GUI,但是当通过“批处理”启动时 GUI 不显示(我怀疑“批处理”不适用于任何与图形相关的内容)。

【问题讨论】:

    标签: matlab user-interface plot


    【解决方案1】:

    从计时器对象运行绘图函数。这将使您将两个轴的逻辑分开:每个轴一个计时器。请参阅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数据结构中,切换按钮回调只需要启动和停止定时器即可。

    【讨论】:

    • 好主意。这比会吞噬你的 CPU 的永久循环安全得多!
    • 谢谢。假设这工作正常,我认为这是应该这样做的方式。我不知道为什么我以前没有使用过计时器。
    【解决方案2】:

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

    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
    

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

    【讨论】:

    • 谢谢。我目前无法对此进行测试,但我明白为什么它应该起作用。我认为可以通过在主 GUI 中连续运行 while 循环并仅在当前存在的那些轴上绘图来修改此过程以在多 GUI 情况下工作。但是,还有一个我在最初的帖子中忽略的问题:当处于“连续绘图”状态时,Matlab 中的其他函数也会冻结。例如,输入到命令行的命令在连续绘图停止之前不会完成它们的评估。有什么办法解决这个问题?
    • @user3112939:您需要使用计时器对象
    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    相关资源
    最近更新 更多