【问题标题】:Updating chart in a GUI with Timer creates a new figure & axes使用 Timer 在 GUI 中更新图表会创建一个新的图形和轴
【发布时间】:2016-08-11 07:49:57
【问题描述】:

我正在尝试制作一个程序,在一段时间内显示一次来自经纪人的实时图表数据。例如,时间段可以是 5 秒或 15 分钟。

我已经制作了一个 GUI 和一个计时器。当程序启动时,第一个绘图转到 GUI 中的axes。但是,所有更新的绘图(来自计时器)都进入一个新图形(只有一个),而不是 GUI 中的图形。

附上一些代码:

这是在 GUI .m 文件的 openingFcn

handles.timer = timer(...
'ExecutionMode', 'fixedRate', ...   % Run timer repeatedly
'Period', 5, ...                % Initial period is 5 sec.
'TimerFcn', {@updateChart,hObject}); % Specify callback
guidata(hObject,handles)
axes(handles.axes1);

candle(highBid, lowBid, closeBid, openBid);

start(handles.timer);

还有函数updateChart

function updateChart(hObject,eventdata,hfigure)
% Get new data, one candle at a time
...
% How many times the chart has already updated
handles = guidata(hfigure);
k = handles.timer.TasksExecuted;

...

% Draw (update) the chart
hold on;
axes(handles.axes1);
candle(highBid, lowBid, closeBid, openBid); % this will be plotted in a new figure !

关于如何在 GUI 窗口更新图表有什么建议吗?

【问题讨论】:

  • 开始,在updateChart函数中,将声明axes(handles.axes1);调用candle(...)之前。
  • 感谢您的回复,我进行了编辑。我还更正了第一条蜡烛线,因为它没有返回句柄,所以handles.chart = candle(..) 没有用。这是意外留下的,因为之前我尝试了返回句柄的 highlow。
  • 我忘了说它没有帮助。图形仍会在 gui 上方弹出,并且程序会继续执行该图形而不是 gui 中的图形。
  • 我没有金融工具箱,所以无法重现您的问题。我建议打开candle.m 函数并尝试找出如何选择axes 进行绘图...
  • 您可以使用任何其他绘图命令,例如命令“绘图”本身来重现问题。在发布到 Stackoverflow 之前,我从以下链接获得了一些帮助:se.mathworks.com/matlabcentral/answers/…。但是,我仍然无法更新 GUIDE 轴上的任何绘图。我进行的每一次试验都会打开一个新图并开始更新该图。

标签: matlab user-interface timer matlab-guide


【解决方案1】:

我找到了解决它的方法。事实上,任何一种高级绘图功能都会发生同样的事情。我不得不用plot 函数重现您的问题,并且行为如您所描述的那样。

简答:

您必须将 figureHandleVisibility 设置为 on(而不是默认设置 callback)。如果您正在使用GUIDE,则必须直接在图形属性检查器中从GUIDE 设置它(由于某些模糊的原因,如果稍后在初始化代码中设置它就不起作用):

此设置将使timer 回调具有figure 子对象的可见性,因此plot 命令在面对不可见的对象时不会决定创建一组新的axesfigure


注1:

当使用正确的目标句柄指定plot 命令时,绘图总是在右侧axes 中刷新。对于支持在参数中传递目标axes 的图形函数,语法:

% infallible syntax (when allowed)
plot( data2plot , 'Parent',targetAxesHandle)

总是比您使用的那个更可取(设置一个axes 活动然后在当前活动的axes 中绘图)

% this syntax may fail to plot in the right "axes" somtimes, as you observed
axes(targetAxesHandle);
plot( data2plot )

现在阅读您的特定绘图函数candle 的文档,我没有找到可以将axes 句柄传递给它的线索,因此对于这种类型的函数,您必须求助于上面给出的解决方案这篇文章的。 但是,如果您向工具箱的作者提供一些反馈,我强烈建议您告诉他们这个重要的缺失功能。


注2:

您不必在每个情节之前致电hold on。如果您知道您将始终“添加”到绘图中,则可以在初始化代码中一劳永逸地设置它:

set(handles.axes1,'Nextplot','add') % set "Hold on" permanently for "axes1"

如果你想删除锁定的保持,只需设置:

set(handles.axes1,'Nextplot','replace') % set "Hold off" permanently for "axes1"

【讨论】:

  • 这就像一个魅力。非常感谢你。我计划向 Mathworks 提供有关烛形函数的反馈。
猜你喜欢
  • 1970-01-01
  • 2018-05-07
  • 2015-07-20
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多