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