2011-02-09 65 views
15

在Matlab中,当用户放大绘图窗口时,我想更新绘制在一组轴上的数据。例如,假设我想绘制一个分析定义的特定函数。当用户放大轨迹时,我想用附加数据更新绘图窗口,以便他们可以用任意分辨率检查函数。绘图放大/调整大小/重绘时,Matlab是否执行回调?

当视图改变时,Matlab是否提供钩子来更新数据? (或者干脆当它重新绘制?)

回答

9

是的,它的确如此。所述ZOOM模式对象具有以下回调:

ButtonDownFilter 
ActionPreCallback 
ActionPostCallback 

后两者执行要么只是之前或刚好在变焦功能。您可以在ActionPostCallback中设置您的更新功能,您可以根据新的轴限制(轴的句柄作为第二个输入参数传递给回调函数)更新绘图。

+0

谢谢,这正是我一直在寻找的!是否还有一个通用的重绘回调? – nibot 2011-02-09 02:09:42

+0

@nibot:你的意思是,像[`refresh`](http://www.mathworks.com/help/techdoc/ref/refresh.html)?或者,`drawnow`刷新队列。 – Jonas 2011-02-09 02:13:10

16

虽然我还没有找到一个通用的“重绘”回调来解决这个问题,但我已经设法凑齐了一组四个回调*,这些回调似乎在所有情况下都能达到这个目标。对于给定的对象坐标轴ax = gca()

1.设置zoom callback function遵医嘱by @Jonas
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

2.设置一个pan callback function
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

3.安装一个figure resize callback function
set(getParentFigure(ax),'ResizeFcn',@(x,y) myCallbackFcn(ax));

4. 编辑:这个不再适用于R2014b,但只有在向图中添加(例如,更改轴位置而不更改图形尺寸或轴缩放/平移)的颜色条时才需要。我没有找过替代品。最后,为轴位置属性本身设置一个undocumented property listener。这里有一个重要的技巧:我们必须坚持对handle.listener对象的句柄,因为一旦它被删除(或离开作用域),它将删除回调。轴对象本身的UserData属性在很多情况下是存储它的好地方。

hax = handle(ax); 
hprop = findprop(hax,'Position'); 
h = handle.listener(hax,hprop,'PropertyPostSet',@(x,y) myCallbackFcn(ax)); 
set(ax,'UserData',h); 

在所有这些情况下,我选择放弃默认的回调事件的参数,而是一个匿名函数中捕捉问题的轴。我发现这比试图应对通过这些不同的回调场景传播的所有不同形式的争论更有用。

*此外,有这么多不同的回调源飞来飞去,我觉得在myCallbackFcn的开头有一个recursion check以确保我不会以无限循环结束。

相关问题