Matlab是否在缩放/调整大小/重绘图形时执行回调函数?

15
在Matlab中,我希望当用户缩放绘图窗口时,能够更新一组轴中的数据。例如,假设我想要绘制一个通过解析定义的特定函数,当用户缩放到迹线时,我想要更新绘图窗口以添加额外的数据,以便他们可以使用任意分辨率检查该函数。
Matlab是否提供钩子来在视图更改时更新数据?(或仅在重新绘制时更新?)
2个回答

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. 最后,为轴位置属性本身设置一个未公开的属性监听器。这里有一个重要的技巧:我们必须持有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的开头进行递归检查非常宝贵,以确保我不会陷入无限循环中。

2
根据官方文档,从R2014b开始,handle.listener将不再起作用。 - embert

9
是的,它有。ZOOM模式对象具有以下回调函数:ZOOM
ButtonDownFilter
ActionPreCallback
ActionPostCallback

后两者在缩放功能之前或之后执行。您可以在 ActionPostCallback 中设置更新函数,在那里您可以根据新的轴限制更新绘图(轴的句柄作为回调的第二个输入参数传递)。

谢谢,这正是我在寻找的!还有通用的重绘回调函数吗? - nibot
@nibot:你的意思是像refresh这样吗?或者,drawnow可以清空队列。 - Jonas
1
我的意思是,有没有办法让Matlab在重新绘制图形时调用我指定的函数? - nibot
据我所知,没有记录的方法可以做到这一点,因为重绘在Matlab的内部非常深。 - Jonas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接