我尝试设置缩放后回调函数,以便在缩放时以特定方式修改图形。此调用提示最终跟踪到plotyy
函数的错误。
作为一个简单的示例,请考虑以下代码块,它在一组bar
上绘制两个axes
元素,并使用zoom
行为定义ActionPostCallback
个对象组。这段代码执行没有任何问题,并支持在下面的问题中详述的缩放调用函数。
h=figure;
z=zoom(h);
set(z,'ActionPostCallback',@post_callback);
plt1=bar(1:6,1:6);
hold on;
plt2=bar(4:6,1:3);
set(plt2,'FaceColor','r');
进行简单的更改,即为bar
命令交换plotyy
绘图命令,将每个绘图对象分配给一组单独的axes
,导致代码无效这会触发下面详述的通常无用的错误消息。重现异常和不良行为的代码示例如下:
h=figure;
z=zoom(h);
set(z,'ActionPostCallback',@post_callback);
[ax,plt1,plt2]=plotyy(1:6,1:6,4:6,1:3,@bar,@bar)
hold on;
set(plt2,'FaceColor','r');
请注意,两个代码示例共有的函数post_callback
为given by:
function post_callback(obj,evd)
newLim = get(evd.Axes,'XLim');
msgbox(sprintf('The new X-Limits are [%.2f %.2f].',newLim));
在运行第二个但不是第一个代码块后执行缩放操作时显示的错误消息完全无法提供信息:
Warning: An error occurred during the mode callback.
> In uitools.uimode.fireActionPostCallback at 14
In zoom>local2DButtonUpFcn at 1332
In hgfeval at 63
In uitools.uimode.modeWindowButtonUpFcn at 46
In uitools.uimode.setCallbackFcn>localModeWindowButtonUpFcn at 58
研究所显示的每个文件中的相关行对我来说没有帮助,但是我将它们发布在这里,以防其他人能够从中辨别出意义:
uitools.uimode.fireActionPostCallback [lines 9-16]
try
if ~isempty(hThis.ActionPostCallback)
hgfeval(hThis.ActionPostCallback,hFig,evd);
end
catch
warning('MATLAB:uitools:uimode:callbackerror',...
'An error occurred during the mode callback.');
end
zoom>local2DButtonUpFcn [lines 1330-1332]
localDoZoom2D(currentAxes,currentXLim,currentYLim,newXLim,newYLim);
% Fire mode post callback function:
hMode.fireActionPostCallback(localConstructEvd(currentAxes));
hgfeval [lines 62-66]
if cellFunction
feval(fcn{1},varargin{:},fcn{2:end});
else
evalin('base', fcn);
end
uitools.uimode.modeWindowButtonUpFcn [lines 45-46]
% Execute the specified callback function
hgfeval(newButtonUpFcn,hFig,evd);
uitools.uimode.setCallbackFcn>localModeWindowButtonUpFcn [lines 56-58]
function localModeWindowButtonUpFcn(hFig,evd,hThis,newButtonUpFcn)
hThis.modeWindowButtonUpFcn(hFig,evd,hThis,newButtonUpFcn);
如果有人能够阐明这一错误的起因以及可以避免的错误,我将不胜感激。 plotyy
和`zoom> ActionPostCallback'根本不兼容吗?
答案 0 :(得分:1)
好的,我发现了错误。由于发生错误的最后一行不在堆栈跟踪中,因此出现问题。但是,问题不是由zoom
或plotyy
引起的。由于实际执行变焦这一事实可以看出这一点。尝试运行postCallbackFcn时抛出错误。问题是`sprintf不接受单元输入。解决方法可以是这样的。
function mypostcallback(obj,evd)
newLim = get(evd.Axes,'XLim')'; % Transpose
newLim = horzcat(newLim{:}); % cell input is not allowed for sprintf
msgbox(sprintf('The new X-Limits are [%.2f %.2f] and [%.2f %.2f].',newLim));
抱歉花了这么长时间,希望这会有所帮助。