在Matlab中,我希望当用户缩放绘图窗口时,能够更新一组轴中的数据。例如,假设我想要绘制一个通过解析定义的特定函数,当用户缩放到迹线时,我想要更新绘图窗口以添加额外的数据,以便他们可以使用任意分辨率检查该函数。
Matlab是否提供钩子来在视图更改时更新数据?(或仅在重新绘制时更新?)
Matlab是否提供钩子来在视图更改时更新数据?(或仅在重新绘制时更新?)
虽然我还没有找到一个通用的“重绘”回调函数来解决这个问题,但是我已经成功地组合了一组四个回调*函数,似乎在(几乎?)所有情况下都能达到这个目标。对于给定的轴对象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
的开头进行递归检查非常宝贵,以确保我不会陷入无限循环中。ButtonDownFilter
ActionPreCallback
ActionPostCallback
ActionPostCallback
中设置更新函数,在那里您可以根据新的轴限制更新绘图(轴的句柄作为回调的第二个输入参数传递)。
handle.listener
将不再起作用。 - embert