www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@xregmultigraph2d/private/pr_factorsort.m
function pr_factorsort(gr) %PR_FACTORSORT % Private function for sorting out any mismatch between data length and % number of given factors. % Copyright 2000-2011 The MathWorks, Inc. and Ford Global Technologies, Inc. ud = get(gr.axes,'UserData'); data=get(gr.xtext,'UserData'); sd=size(data,2); factors=ud.xfactors; labels=get(gr.xfactor,'String'); ydata = []; clbls = {}; if isempty(factors) factors={}; end % get current factor selection values vals=get([gr.xfactor;gr.yfactor],{'Value'}); % check values vals=cat(1,vals{:}); actvals = vals; if ischar(labels) && strcmp(labels,' ') && all(vals==1) % assume a new-graph case: initialise factor numbers sequentially vals(:)=sd; vals(1:sd)=1:sd; vals=vals(1:2); set(gr.xfactor,'String',{' '}); else vals(vals>sd)=sd; end vals=num2cell(vals); ud.xypossible = 0; switch ud.type case {'single','table'} if ~isempty(data) % sort out labels to match data [clbls,ydata] = sortSingleTable(gr,factors,sd,ud,vals,data); end ud.yseltype = 1; % Done the standard case. Now consider multi plot case {'multi','multinoerror'} [ydata,clbls,ud] = sortMulti(gr,data,factors,sd,ud,actvals); otherwise data = []; end % Set colorbar factors ud = setColorbarFactors(gr,ud,data,ydata,clbls); set(gr.axes,'UserData',ud); return %----------------------------------------------------------------------- function [fac,matched] = i_MatchFactor(factors,hndl) %----------------------------------------------------------------------- % check currently display x-factor; match up to new one if possible. fac = get(hndl,'Value'); oldfactors = get(hndl,'String'); ind = []; if iscell(oldfactors) && ismember(fac,1:length(oldfactors)) name = oldfactors{fac}; ind = find( strcmp( name,cellstr(factors) ) ); end if length(ind)==1 fac = ind; matched = 1; else fac = 1; matched = 0; end function [clbls,ydata] = sortSingleTable(gr,factors,sd,ud,vals,data) if length(factors)>=sd lbls=factors(1:sd); elseif length(factors)<sd lbls=cellstr([repmat('col',sd,1) num2str((1:sd)')]); lbls(1:length(factors))=factors; end if ud.yseltype~=1 vals{2} = 2; vals{1} = i_MatchFactor(lbls,gr.xfactor); end if vals{2}==vals{1} && ud.exclusive if vals{1}==1 vals{2} = 2; else vals{2} = 1; end end clbls = lbls; lbls=repmat({lbls},[2 1]); set([gr.xfactor;gr.yfactor],{'String','Value'},[lbls,vals]); ydata = data; function [ydata,clbls,ud] = sortMulti(gr,data,factors,sd,ud,actvals) ydata = get(gr.ytext,'UserData'); if ~isempty(ydata) && ~isempty(data) % Check same size as data if size(ydata,1)>size(data,1) ydata = ydata(1:size(data,1),:); set(gr.ytext,'UserData',ydata); elseif size(data,1)>size(ydata,1) set(gr.xtext,'UserData',data(1:size(ydata,1),:)); end end if ~isempty(data) if length(factors)>=sd xlbls=factors(1:sd); elseif length(factors)<sd xlbls=cellstr([repmat('col',sd,1) num2str((1:sd)')]); xlbls(1:length(factors))=factors; end end if isempty(ydata) clbls = {}; ud.checkedyfactors = []; else clbls = xlbls; sd2 = size(ydata,2); if length(ud.yfactors)>=sd2 yfacs = ud.yfactors(1:sd2); elseif length(ud.yfactors)<sd2 yfacs=cellstr([repmat('item',sd2,1) num2str((1:sd2)')]); yfacs(1:length(ud.yfactors))=ud.yfactors; end ud.checkedyfactors = yfacs; if ~isempty(ud.yunitstring) us = [' (' ud.yunitstring ')']; else us = ''; end if strcmp(ud.type,'multi') && size(ydata,2)==2 % sort out labels to match data ylbls = {['<Selection>' us] ['<X-Y Selection>' us] ... ['Error' us] ['Absolute Error' us] 'Relative Error (%)' ... 'Absolute Relative Error (%)'}; xlbls = {['<X-Y Selection>' us] xlbls{:}}; if ud.yseltype~=2 actvals(2)=1; [actvals(1),matched] = i_MatchFactor(xlbls,gr.xfactor); if ~matched, actvals(1) = 2; end end ud.yseltype = 2; ud.xypossible = 1; else if ud.yseltype~=3 [actvals(1),matched] = i_MatchFactor(xlbls,gr.xfactor); if ~matched, actvals(1) = 1; end end ud.yseltype = 3; ylbls = {['<Selection>' us]}; end if actvals(2)>length(ylbls) actvals(2)=length(ylbls); end set(gr.yfactor,'String',ylbls,'Value',actvals(2)); if ~isempty(data) if actvals(1)>length(xlbls) actvals(1)=length(xlbls); end set(gr.xfactor,'String',xlbls,'Value',actvals(1)); end end function ud = setColorbarFactors(gr,ud,data,ydata,clbls) if ud.colorbar && ~isempty(data) cdata = get(gr.yfactor,'UserData'); if ~isempty(cdata) && all(size(cdata)==size(ydata)) if isempty(ud.colorfactor) cfac = 'Point data'; else cfac = ud.colorfactor; end clbls = [{cfac};clbls]; cbardata = repmat(min(cdata(:)),size(data,1),1); cbardata(1) = max(cdata(:)); cbardata = [cbardata data]; ud.colordatavalid = 1; else cbardata = data; ud.colordatavalid = 0; end if ~isempty(clbls) set(gr.colorbar,'factors',clbls,'data',cbardata); ud.colorbarvalid = 1; else set(gr.colorbar,'factors',[],'data',[]); ud.colorbarvalid = 0; ud.colordatavalid = 0; end end