www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@mvgraph2d/set.m
function gr=set(gr,varargin) %SET Set interface for mvgraph2d object % % Provides a set interface to the mvgraph2d object. This object has two % modes of operation: if a factors list is specified then it plots ones % column against another. If row and column headings are specified then % it plots a 2D image of the entire data matrix. % % Valid properties are: % 'Position' - 4 element position vector in pixels % 'Visible' - 'on' or 'off' % 'Data' - matrix of data with a column for each factor % 'Factors' - cell array of strings corresponding to each factor % 'Parent' - change parent figure (useful for saving a copy of graph) % 'Type' - one of 'graph', 'sparse' or 'image' % 'Transparentcolor' - color to set ui item backgrounds to when the % overall background is set to 'none' by prefsgui. % 'Backgroundcolor' - color for background patch % 'Callback' - Callback string to execute when a different factor is chosen. % The string may contain the tokens %OBJECT%, %XVALUE% and %YVALUE% % which are replaced with copies of the object, the x-factor popup % value and the y-factor popup value respectively. % 'Userdata' - Userdata field for general use by user. % 'Grid' - Turn grid on or off. % 'Markersize'- Set the scatter plot line to use the given markersize % 'Frame' - On/off: turn the bounding box on and off % % Plus a load of other properties that are visible by getting the handles % Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc. % Bail if we've not been given a graph2d object if ~isa(gr,'mvgraph2d') error(message('mbc:mvgraph2d:InvalidObject')) end redraws=[0 0 0 0]; % flags to signal a factorsort, graphlim, plot and cbarfaces % loop over varargin for n=1:2:(nargin-2) drawreqs=[0 0 0 0]; switch lower(varargin{n}) case 'position' newpos = varargin{n+1}; set(gr.panel, 'Position', newpos); ud = gr.DataPointer.info; oldpos = ud.position; ud.position = newpos; gr.DataPointer.info = ud; % Update position of items within the panel if required if any(oldpos(3:4)~=newpos(3:4)) [gr,drawreqs]=i_position(gr,newpos); end case 'visible' set(gr.panel, 'Visible', varargin{n+1}); case {'data','value','number'} [gr,drawreqs]=i_data(gr,varargin{n+1}); case 'factors' [gr,drawreqs]=i_factors(gr,varargin{n+1}); case 'parent' set(gr.panel,'Parent',varargin{n+1}); case 'type' [gr,drawreqs]=i_type(gr,varargin{n+1}); case 'colormap' [gr,drawreqs]=i_cmap(gr,varargin{n+1}); case 'grid' [gr,drawreqs]=i_grid(gr,varargin{n+1}); case 'currentxfactor' [gr,drawreqs]=i_select(gr,varargin{n+1},'x'); case 'currentyfactor' [gr,drawreqs]=i_select(gr,varargin{n+1},'y'); case 'limits' [gr,drawreqs]=i_limits(gr,varargin{n+1}); case 'factorselection' [gr,drawreqs]=i_seltype(gr,varargin{n+1}); case 'transparentcolor' [gr,drawreqs]=i_transclr(gr,varargin{n+1}); case 'backgroundcolor' [gr,drawreqs]=i_backclr(gr,varargin{n+1}); case 'callback' ud = gr.DataPointer.info; ud.callback = varargin{n+1}; gr.DataPointer.info = ud; case 'frame' [gr,drawreqs]=i_frame(gr,varargin{n+1}); case 'userdata' ud = gr.DataPointer.info; ud.userdata = varargin{n+1}; gr.DataPointer.info = ud; case 'markersize' set(gr.line,'MarkerSize',varargin{n+1}); case 'hittest' set([gr.axes;gr.line],'HitTest',varargin{n+1}); case 'datatags' [gr,drawreqs] = i_datatagtype(gr,varargin{n+1}); case 'customdatatags' [gr,drawreqs] = i_customtags(gr,varargin{n+1}); end redraws= (redraws | drawreqs); end if redraws(1) pr_factorsort(gr); end if redraws(2) pr_graphlim(gr); end if redraws(3) pr_plot(gr); end if redraws(4) pr_cbarfaces(gr.colorbar.bar,get(gr.colorbar.bar,'FaceVertexCData')); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_position - alter position of objects within the panel %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_position(gr,newpos) % Adjust rectangle to account for the border width newpos(3:4) = newpos(3:4)-2; drawreqs=[0 0 0 0]; ud = gr.DataPointer.info; % if position is too small, display an image indicating this mnsz=minsize(gr); if newpos(3)<mnsz(1) || newpos(4)<mnsz(2) % go to blackout mode impos=[max(floor(newpos(3:4).*0.5)-15, [1 1]), min([32 32],newpos(3:4))]; impos = mbcgui.util.clipRect(impos); set(gr.badim,'Position', impos,'Visible','on'); set([gr.image;gr.axes; ... gr.xfactor;gr.yfactor;gr.xtext;gr.ytext; ... gr.line;gr.colorbar.bar;gr.colorbar.axes],'Visible','off'); set(ud.datataghandles, 'Visible', 'off'); else % work out positions % axes pos = [0 0 newpos(3) 0]; if strcmp(ud.type,'graph') pos(2)=35; % Leave room for the factor selectors elseif strcmp(ud.type,'image') pos(2)=50; % Leave room for the colorbar else pos(2)=10; end pos(4) = newpos(4)-pos(2); set(gr.axes,'OuterPosition',pos); % ui's pos(1)=1; pos(2)=1; pos(3)=newpos(3); pos(4)=33; % if newpos(4)<250 % % gradually reduce from 50 to 30 pixels % pos(4)=max(30,50-0.5*(250-newpos(4))); % else % % max out at 50 from 250 upwards % pos(4)=50; % end set(gr.controls,'Position',pos); % colorbar axes pos(1)=newpos(3)/10; pos(2)=25; pos(3)=0.8*newpos(3); pos(4)=20; set(gr.colorbar.axes,'Position',pos); drawreqs(2)=1; set(gr.badim, 'Visible', 'off'); hextras=get(gr.axes,'Children'); if ~isempty(hextras) remv=ismember(hextras,[gr.line;gr.image]); hextras(remv)=[]; end all_hndls = [gr.axes; ... gr.line;gr.xtext;gr.xfactor;gr.ytext;gr.yfactor; hextras(:); ... gr.image;gr.colorbar.axes;gr.colorbar.bar]; hndls = gr.axes; switch lower(ud.type) case 'graph' hndls=[hndls;gr.line;gr.xtext;gr.xfactor;gr.ytext;gr.yfactor; hextras(:)]; case 'sparse' hndls=[hndls;gr.line]; case 'image' hndls=[hndls;gr.image;gr.colorbar.axes;gr.colorbar.bar]; end set(hndls,'Visible','on'); set(setdiff(all_hndls, hndls), 'Visible', 'off'); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_data - insert data into object %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_data(gr,data) % interesting one. Need to plot nth column of data if there are labels % defined and they don't go outside the defined data ud = gr.DataPointer.info; ud.data = data; gr.DataPointer.info = ud; drawreqs=[1 1 1 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_factors - insert factors into object %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_factors(gr,factors) if size(factors,1)==1 && size(factors,2)>2 factors=factors(:); end ud = gr.DataPointer.info; ud.factors = factors; gr.DataPointer.info = ud; drawreqs=[1 0 1 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_type - change type of 2d graph %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_type(gr,tp) tp=lower(tp); drawreqs=[0 0 0 0]; if ~any(strcmp(tp,{'graph','sparse','image'})) return end ud = gr.DataPointer.info; if ~strcmp(tp,ud.type) ud.type = tp; gr.DataPointer.info = ud; drawreqs([2 3])=1; gr = i_position(gr,ud.position); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_cmap - insert new colormap for image view %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_cmap(gr,cmap) % update colorbar set(gr.colorbar.axes,'XLim',[0.5 size(cmap,1)+0.5]); pr_cbarfaces(gr.colorbar.bar,cmap); % update colorbar labelling clim = get(gr.colorbar.axes,'CLim'); labpoints = get(gr.colorbar.axes,'XTick'); actpoints = clim(1)+(labpoints-0.5).*(clim(2)-clim(1))./(size(cmap,1)); actpoints = cellstr(num2str(actpoints',2)); set(gr.colorbar.axes,'XTickLabel',actpoints); % Will need to replot data to ensure new colormap is carried into data drawreqs=[0 0 1 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_grid - turn grid on/off %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_grid(gr,grd) if strcmp(grd,'on') val=1; else val=0; end ud = gr.DataPointer.info; ud.grid = val; gr.DataPointer.info = ud; drawreqs=[0 0 1 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_select - change factor selection %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_select(gr,sel,ax) switch ax case 'x' obj=gr.xfactor; case 'y' obj=gr.yfactor; end set(obj,'Value',sel); drawreqs=[0 0 1 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_limits - set explicit limits on the factors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_limits(gr,lim) if iscell(lim) ud = gr.DataPointer.info; ud.limits = lim; gr.DataPointer.info = ud; drawreqs=[0 1 0 0]; else drawreqs=[0 0 0 0]; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_seltype - change behaviour of lists %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_seltype(gr,selset) drawreqs=[0 0 0 0]; ud = gr.DataPointer.info; switch lower(selset) case 'exclusive' % check settings lbls=get(gr.xfactor,'String'); if ~iscell(lbls) lmax=1; else lmax=length(lbls); end vals=get([gr.xfactor;gr.yfactor],{'Value'}); vals=cat(1,vals{:}); ch=0; used=vals(1); for n=2 if any(vals(n)==used) % find lowest unused srch=1:(length(used)+1); new=setxor(used,srch); new=min(new(1),lmax); vals(n)=new; ch=1; end used=[used vals(n)]; end if ch set([gr.xfactor;gr.yfactor],{'Value'},num2cell(vals)); drawreqs([2 3])=1; end ud.factorselection = 1; case 'normal' % just change flag ud.factorselection = 0; end gr.DataPointer.info = ud; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_transclr - change transparency colour %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_transclr(gr,col) ud = gr.DataPointer.info; ud.transcolor = col; gr.DataPointer.info = ud; % update if patch is set to none. cnow=get(gr.panel,'BackgroundColor'); if ischar(cnow) && strcmp(cnow,'none') set([gr.xtext;gr.ytext],'BackgroundColor',col); end drawreqs=[0 0 0 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_backclr - change background colour %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_backclr(gr,col) ud = gr.DataPointer.info; if ischar(col) && strcmp(col,'none') bgcol = ud.transcolor; else bgcol = col; end set(gr.panel,'BackgroundColor',col); set([gr.xtext;gr.ytext],'BackgroundColor',bgcol); drawreqs=[0 0 0 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_frame - turn bounding frame on/off %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_frame(gr,state) ud = gr.DataPointer.info; if strcmp(state,'on') set(gr.panel,'HighlightColor','k'); ud.ShowFrame = true; else set(gr.panel,'HighlightColor',get(gr.panel, 'BackgroundColor')); ud.ShowFrame = false; end gr.DataPointer.info = ud; drawreqs=[0 0 0 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_datatagtype - set data tag type %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_datatagtype(gr,tagtype) ud = gr.DataPointer.info; switch lower(tagtype) case 'none' tp = 0; case 'enumerate' tp = 1; case 'custom' tp = 2; case 'coincident' tp = 3; otherwise tp = 0; end if tp~=ud.datatags ud.datatags = tp; if tp==0 delete(ud.datataghandles); ud.datataghandles = []; drawreqs = [0 0 0 0]; else drawreqs = [0 0 1 0]; end gr.DataPointer.info = ud; else drawreqs = [0 0 0 0]; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_customtags - set custom tag strings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_customtags(gr,sTags) if iscell(sTags) ud = gr.DataPointer.info; ud.customdatatags = sTags; gr.DataPointer.info = ud; if ud.datatags==2 drawreqs = [0 0 1 0]; else drawreqs = [0 0 0 0]; end end