English 中文(简体)
当绘图被缩放/调整大小/重新绘制时,Matlab是否执行回调?
原标题:Does Matlab execute a callback when a plot is zoomed/resized/redrawn?
  • 时间:2011-02-09 01:47:27
  •  标签:
  • matlab

在Matlab中,当用户放大绘图窗口时,我想更新在一组轴上绘制的数据。例如,假设我想绘制一个解析定义的特定函数。当用户放大轨迹时,我想用额外的数据更新绘图窗口,这样他们就可以以任意分辨率检查函数。

当视图发生变化时,Matlab是否提供钩子来更新数据?(或者只是在重新绘制时?)

最佳回答

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

ButtonDownFilter
ActionPreCallback
ActionPostCallback

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

问题回答

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

1. Setup the zoom callback function as directed by @Jonas:
set(zoom(ax), ActionPostCallback ,@(x,y) myCallbackFcn(ax));

2. Setup a pan callback function:
set(pan(ax), ActionPostCallback ,@(x,y) myCallbackFcn(ax));

3. Setup a figure resize callback function:
set(getParentFigure(ax), ResizeFcn ,@(x,y) myCallbackFcn(ax));

4.编辑:此选项在R2014b中不再有效,但仅当您向图形添加(例如,颜色条)时才需要(它可以在不更改图形大小或轴缩放/平移的情况下更改轴位置)。我没有找替代者最后,设置一个axes position属性本身的未记录属性listener。这里有一个重要的技巧:我们必须抓住handle.listener对象的句柄,因为一旦它被删除(或离开范围),它就会删除回调。axes对象本身的UserData属性在许多情况下是存放它的好地方。

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

在所有这些情况下,我选择放弃默认的回调事件参数,而是在匿名函数中捕获有问题的轴。我发现这比试图处理通过这些不同的回调场景传播的所有不同形式的参数要有用得多。

*此外,由于有这么多不同的回调源,我发现拥有myCallbackFcn的开头进行递归检查,以确保我不会陷入无限循环。





相关问题
MATLAB Solving equations problem

I want to solve these equations using MATLAB and I am sure there is a non zero solution. The equations are: 0.7071*x + 0.7071*z = x -0.5*x + 0.7071*y + 0.5*z = y -0.5*x - 0.7071*y +...

Difference between MATLAB s matrix notations

How do you read the following MATLAB codes? #1 K>> [p,d]=eig(A) // Not sure about the syntax. p = 0.5257 -0.8507 -0.8507 -0.5257 d = ...

preventing data from being freed when vector goes out of scope

Is there a way to transfer ownership of the data contained in a std::vector (pointed to by, say T*data) into another construct, preventing having "data" become a dangling pointer after the vector goes ...

Divide two polynomials using MATLAB

I want to divide p(x) by q(x) given that: p(x)=-5x^4+3x^2-6x q(x)=x^2+1 I tried: p=inline( -5*(x^4)+3*(x^2) , x ) p = Inline function: p(x) = -5*(x^4)+3*(x^2) q=inline( x^2+1 , x ) q = ...

matlab deals with Fibbonacci

The Fibonacci series is given as follows: 1, 2, 3, 5, 8, 13, 21, ... How can I write a script which calculates and prints the n-th Fibonacci term (for n>2), where n is inputed by the user. This ...

How do I plot lines between all points in a vector?

I have a vector containing some points in 2-D space. I want MATLAB to plot these points with lines drawn from every point to every other point. Basically, I want a graph with all vertices connected. ...

How do I create a string using a loop variable in MATLAB?

I have a loop like this: for i=1:no %some calculations fid = fopen( c:\out.txt , wt ); %write something to the file fclose(fid); end I want data to be written to different files like ...

热门标签