在Matlab中,我想在用户放大绘图窗口时更新在一组轴上绘制的数据。例如,假设我想绘制一个分析定义的特定函数。当用户放大跟踪时,我想用附加数据更新绘图窗口,以便他们可以用任意分辨率检查函数。
当视图发生变化时,Matlab是否提供钩子来更新数据? (或者只是在重绘时?)
答案 0 :(得分: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
对象的句柄,因为一旦它被删除(或留下范围),它就会删除回调。在许多情况下,axis对象本身的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非常宝贵,以确保我不会以无限循环结束。
答案 1 :(得分:9)
是的,确实如此。 ZOOM模式对象具有以下回调:
ButtonDownFilter
ActionPreCallback
ActionPostCallback
后两者在缩放功能之前或之后执行。您可以在ActionPostCallback
中设置更新功能,您可以根据新的轴限制更新绘图(轴的句柄作为回调的第二个输入参数传递)。