在Matlab中,当用户放大绘图窗口时,我想更新在一组轴上绘制的数据.例如,假设我想绘制一个分析定义的特定函数.当用户放大跟踪时,我想用附加数据更新绘图窗口,以便他们可以用任意分辨率检查功能.
当视图发生变化时,Matlab是否提供了更新数据的钩子?(或者只是在重绘时?)
Mat*_* B. 18
虽然我还没有找到一个通用的"重绘"回调来解决这个问题,但我已经设法凑齐了一组四个回调*,似乎在(几乎?)所有情况下实现了这个目标.对于给定的轴对象ax = gca()
,
1. 按照@Jonas的指示设置缩放回调功能:
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
2.设置平移回调函数:
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
3.设置数字调整大小回调函数:
set(
getParentFigure(ax)
,'ResizeFcn',@(x,y) myCallbackFcn(ax));
4. 编辑:这个不再适用于R2014b,但只有在图中添加了一个颜色条(它改变了轴的位置而不改变图形尺寸或轴变焦/平移)时才需要.我没有寻找替代品.最后,为轴位置属性本身设置一个未记录的属性侦听器.这里有一个重要的技巧:我们必须保持handle.listener
对象的句柄,因为一旦它被删除(或留下范围),它就会删除回调.UserData
在许多情况下,axis对象本身的属性是隐藏它的好地方.
hax = handle(ax);
hprop = findprop(hax,'Position');
h = handle.listener(hax,hprop,'PropertyPostSet',@(x,y) myCallbackFcn(ax));
set(ax,'UserData',h);
Run Code Online (Sandbox Code Playgroud)
在所有这些情况下,我选择放弃默认的回调事件参数,而是在匿名函数中捕获有问题的轴.我发现这比试图处理通过这些不同的回调场景传播的所有不同形式的参数更有用.
*此外,有这么多不同的回调源飞来飞去,我发现在开始时进行递归检查是非常宝贵的,myCallbackFcn
以确保我不会在无限循环中结束.
是的,它确实.的ZOOM模式对象具有以下回调:
ButtonDownFilter
ActionPreCallback
ActionPostCallback
Run Code Online (Sandbox Code Playgroud)
后两者在缩放功能之前或之后执行.您可以设置更新功能ActionPostCallback
,根据新轴限制更新绘图(轴的句柄作为回调的第二个输入参数传递).