与plotyy函数相关的matlab缩放回调错误

时间:2014-08-04 03:26:31

标签: matlab

我尝试设置缩放后回调函数,以便在缩放时以特定方式修改图形。此调用提示最终跟踪到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_callbackgiven 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'根本不兼容吗?

1 个答案:

答案 0 :(得分:1)

好的,我发现了错误。由于发生错误的最后一行不在堆栈跟踪中,因此出现问题。但是,问题不是由zoomplotyy引起的。由于实际执行变焦这一事实可以看出这一点。尝试运行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));

抱歉花了这么长时间,希望这会有所帮助。