2014-08-04 2 views
0

Я попытался настроить функцию пост-обратного вызова масштабирования для изменения фигуры определенным образом при масштабировании. Этот вызов вызвал ошибку, которая была в конечном счете прослежена до функции plotyy.Ошибка обратного вызова 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 Plotting команды для 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 

S tudying соответствующие строки в каждом из файлов, указанных не helpfu ко мне, но я отправляю их здесь в случае, если другие могут различать смысл из них:

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

ОК Я нашел ошибку. Возникла проблема, так как конечная строка, где произошла ошибка, не была в трассировке стека. Однако проблема не вызвана 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)); 

Извините, что так долго и надеемся, что это поможет.

+0

Я впечатлен тем, что вы смогли это исправить. К сожалению, фактическая ошибка не была включена в трассировку, поскольку отладка была сложнее, чем это, вероятно, было необходимо. К сожалению, в моей попытке максимально упростить задачу для презентации на этом форуме (и моя убежденность в том, что проблема была «сюжетная» на основе исчерпывающего тестирования, удаляющего разные элементы и проверяющего, произошла ли ошибка), я задал вопрос о проблеме ('plotyy'), который, по-видимому, не является основной причиной. См. Мой новый вопрос, который более точно отражает мою реальную проблему. Еще раз спасибо. – user001

+0

Вот ссылка на новый вопрос: http://stackoverflow.com/q/25114646/873757. Извините, этот первый вопрос оказался несколько красной селедкой ... – user001

Смежные вопросы