www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@xregmultigraph2d/private/pr_graphlim.m

    function pr_graphlim(gr)
%PR_GRAPHLIM Sort out correct limits on axes and colorbar
%
%   PR_GRAPHLIM(GR) sets the correct axes limits and colorbar limits

%   Copyright 2000-2010 The MathWorks, Inc. and Ford Global Technologies, Inc.



ud = get(gr.axes,'UserData');
data=get(gr.xtext,'UserData');

minmax=ud.limits;

xval=get(gr.xfactor,'Value');
% x limits
if ~isempty(data)
    % check minmax for correct size
    if length(minmax)<size(data,2)
        minmax(end+1:size(data,2))={0};
    elseif length(minmax)>size(data,2)
        minmax(size(data,2)+1:end)=[];
    end
    if ud.xypossible
        % Sort out special case
        xval = max(1,xval-1);
    end    
    if ischar(minmax{xval}) && strcmp(minmax{xval},'auto')
        xmn=[];
        xmx=[];
    elseif all(minmax{xval}==0)
        xmn=min(data(:,xval));
        xmx=max(data(:,xval));
    else
        xmn=min(minmax{xval});
        xmx=max(minmax{xval});
    end
else
    xmn=0;xmx=1;
end

% Check type - may be using different data and limits on y axis
switch ud.type
case 'table'
    % use same data for y axis
    % y limits
    if ~isempty(data)
        
        yval=get(gr.yfactor,'Value');
        if ischar(minmax{yval}) && strcmp(minmax{yval},'auto')
            ymn=[];
            ymx=[];
        elseif all(minmax{yval}==0)
            ymn=min(data(:,yval));
            ymx=max(data(:,yval));
        else
            ymn=min(minmax{yval});
            ymx=max(minmax{yval});
        end
        
    else
        ymn=0;ymx=1;
    end
    
    % Ensure table axes come within limits, if current factor corresponds
    %  to table axis, and table is present.
    tud = get(gr.xfactor,'UserData');
    if ~isempty(tud)
        % Check whether table value is being plotted; include values
        if yval==length(minmax)
            ymn = min([ymn;tud.values(:)]);
            ymx = max([ymx;tud.values(:)]);
        elseif xval==length(minmax)
            xmn = min([xmn;tud.values(:)]);
            xmx = max([xmx;tud.values(:)]);
        end
        if tud.tfactor_i(xval)
            axlim = tud.axes{tud.tfactor_i(xval)};
            xmn = min([xmn;axlim(:)]);
            xmx = max([xmx;axlim(:)]);
            if size(axlim, 1) > 1
                axlim = axlim';
            end
            set(gr.axes,'XTick',axlim,...
                'XTickLabel',pr_genaxisticklabels(axlim, 4));
        else
            set(gr.axes,'XTickMode','auto','XTickLabelMode','auto');
        end
        if tud.tfactor_i(yval)
            axlim = tud.axes{tud.tfactor_i(yval)};
            ymn = min([ymn;axlim(:)]);
            ymx = max([ymx;axlim(:)]);
            if size(axlim, 1) > 1
                axlim = axlim';
            end
            set(gr.axes,'YTick',axlim,...
                'YTickLabel',pr_genaxisticklabels(axlim, 4));

        else
            set(gr.axes,'YTickMode','auto','YTickLabelMode','auto');
        end
    else
        set(gr.axes,'XTickMode','auto','XTickLabelMode','auto',...
            'YTickMode','auto','YTickLabelMode','auto');
    end
    
case 'single'
    % use same data for y axis
    % y limits
    if ~isempty(data)
        
        yval=get(gr.yfactor,'Value');
        if ischar(minmax{yval}) && strcmp(minmax{yval},'auto')
            ymn=[];
            ymx=[];
        elseif all(minmax{yval}==0)
            ymn=min(data(:,yval));
            ymx=max(data(:,yval));
        else
            ymn=min(minmax{yval});
            ymx=max(minmax{yval});
        end
        
    else
        ymn=0;ymx=1;
    end
    set(gr.axes,'XTickMode','auto','XTickLabelMode','auto',...
        'YTickMode','auto','YTickLabelMode','auto');
    
case {'multi','multinoerror'}
    % use different data and limits
    data = get(gr.ytext,'UserData');
    minmax = ud.ylimits;
    if ~isempty(data)
        
        if ischar(minmax) && strcmp(minmax,'auto')
            ymn=[];
            ymx=[];
        elseif length(minmax)~=2 || all(minmax==0)
            ymn=min(data,[],1);
            ymx=max(data,[],1);
            if ud.xypossible
                % May be X-Y selection
                yval = get(gr.yfactor,'Value');
                switch yval
                    case 1
                        ymn = min(ymn);
                        ymx = max(ymx);
                    case 2
                        xmn = ymn(1);
                        xmx = ymx(1);
                        ymn = ymn(2);
                        ymx = ymx(2);
                otherwise
                    % Error - set to auto
                    ymn = [];
                    ymx = [];
                end
            else
                ymn = min(ymn);
                ymx = max(ymx);
            end
        else
            ymn=min(minmax);
            ymx=max(minmax);
        end
        
    else
        ymn=0;ymx=1;
    end
    set(gr.axes,'XTickMode','auto','XTickLabelMode','auto',...
        'YTickMode','auto','YTickLabelMode','auto');
end

% do sanity check on min,max

if ~isempty(xmn) && xmn>=xmx
   if xmn==0
      xmn=-0.01;
      xmx=0.01;
   else
      xmn=(1-sign(xmn).*0.01)*xmx;
      xmx=(1+sign(xmx).*0.01)*xmx;
   end
end
if ~isempty(ymn) && ymn>=ymx
   if ymn==0
      ymn=-0.01;
      ymx=0.01;
   else
      ymn=(1-sign(ymn).*0.01)*ymx;
      ymx=(1+sign(ymx).*0.01)*ymx;
   end
end

% check for NaN's
if ~any(isnan([xmn,xmx]))
   if ~isempty(xmn)
      % push min and max apart a smidgeon to fix an R12 axes bug
      delt=(xmx-xmn).*1e-10;
      xmn=xmn-delt;
      xmx=xmx+delt;
      set(gr.axes,'XLim',real([xmn xmx]));
   else
      set(gr.axes,'XLimMode','auto');
   end
end
if ~any(isnan([ymn,ymx]))
   if ~isempty(ymn)
      % push min and max apart a smidgeon to fix an R12 axes bug
      delt=(ymx-ymn).*1e-10;
      ymn=ymn-delt;
      ymx=ymx+delt;
      set(gr.axes,'YLim',real([ymn ymx]));
   else
      set(gr.axes,'YLimMode','auto');
   end
end


return