function handle=thincolorbar(arg1, arg2, arg3) %THINCOLORBAR Display color bar (color scale). % % This is a modification of Matlab's colorbar function that % generates thinner colorbars. % % THINCOLORBAR('vert') appends a vertical color scale to the current % axes. THINCOLORBAR('horiz') appends a horizontal color scale. % % THINCOLORBAR(H) places the thincolorbar in the axes H. % The thincolorbar will be horizontal % if the axes H width > height (in pixels). % % THINCOLORBAR without arguments either adds a new vertical color % scale or updates an existing thincolorbar. % % H = THINCOLORBAR(...) returns a handle to the thincolorbar axes. % % THINCOLORBAR(...,'peer',AX) creates a thincolorbar associated with % axes AXinstead of the current axes. % % See also IMAGESC. % Clay M. Thompson 10-9-92 % Copyright 1984-2002 The MathWorks, Inc. % $Revision: 5.52 $ $Date: 2002/04/08 22:00:12 $ narg = nargin; % when this is done doing whatever it does % gcf and gca should be what they were when we got here % so get them now GCF = gcf; GCA = gca; if narg<2 haxes = gca; hfig = gcf; if narg<1 loc = 'vert'; % Default mode when called without arguments. else % Peer must be followed by a valid axes handle. if strcmp(arg1,'peer') error('Parameter ''peer'' must be followed by an axes handle.'); end loc = arg1; end elseif narg == 2 % This is the case ONLY when peer and a handle is passed. if strcmp(arg1,'peer') if ishandle(arg2) & strcmp(get(arg2, 'type'), 'axes') haxes = arg2; hfig = get(haxes,'parent'); loc = 'vert'; narg = 0; else % If second arg is not a valid axes handle error('Second argument must be a scalar axes handle.'); end else error('Unknown command option.'); end else % For three arguments the first must be the mode or a axes handle, % second must be the string 'peer' and third must be the peer axes handle. loc = arg1; if strcmp(arg2,'peer') if ishandle(arg3) & strcmp(get(arg3, 'type'), 'axes') haxes = arg3; hfig = get(haxes,'parent'); narg = 1; else error('Third argument must be a scalar axes handle.'); end else error('Unknown command option.'); end end % Catch colorbar('delete') special case -- must be called by the deleteFcn. if narg==1 & strcmp(loc,'delete') ax = gcbo; % % If called from ColorbarDeleteProxy, delete the colorbar axes % if strcmp(get(ax,'tag'),'ColorbarDeleteProxy') cbo = ax; ax = get(cbo,'userdata'); if ishandle(ax) ud = get(ax,'userdata'); % Do a sanity check before deleting colorbar if isfield(ud,'ColorbarDeleteProxy') & ... isequal(ud.ColorbarDeleteProxy,cbo) & ... ishandle(ax) try delete(ax) end end end else % % If called from the colorbar image resize the original axes % if strcmp(get(ax,'tag'),'TMW_COLORBAR') ax=get(ax,'parent'); end ud = get(ax,'userdata'); if isfield(ud,'PlotHandle') & ... ishandle(ud.PlotHandle) & ... isfield(ud,'origPos') & ... ~isempty(ud.origPos) % Get position and orientation of colorbar being deleted delpos = get(ax,'Position'); if delpos(3)<delpos(4) delloc = 'vert'; else delloc = 'horiz'; end % Search figure for existing colorbars % If one is found with the same plothandle but that is not % the same colorbar as the one being deleted % Get its position and orientation otherloc = ''; otherpos = []; othercbar = []; phch = get(findall(hfig,'type','image','tag','TMW_COLORBAR'),{'parent'}); for i=1:length(phch) phud = get(phch{i},'userdata'); if isfield(ud,'PlotHandle') & isfield(phud,'PlotHandle') if isequal(ud.PlotHandle,phud.PlotHandle) if ~isequal(phch{i},ax) othercbar = phch{i}; otherpos = get(phch{i},'Position'); if otherpos(3)<otherpos(4) otherloc = 'vert'; else otherloc = 'horiz'; end break; end end end end % get the current plothandle units units = get(ud.PlotHandle,'units'); % set plothandle units to normalized set(ud.PlotHandle,'units','normalized'); % get current plothandle position phpos = get(ud.PlotHandle,'position'); % if the colorbar being deleted is vertical % set the plothandle axis width to the original Pos % width of the colorbar being deleted % if there is another (horizontal) colorbar % do the same to that if strncmp(delloc,'vert',1) phpos(3) = ud.origPos(3); set(ud.PlotHandle,'position',phpos); if strncmp(otherloc,'horiz',1) otherpos(3) = ud.origPos(3); set(othercbar,'position',otherpos); end % update legend (which resizes plothandle) % only when deleting vertical colorbars legH=legend(ud.PlotHandle); if ~isempty(legH) & ishandle(legH) % save size of current plothandle axes with legend ud legend('RecordSize',ud.PlotHandle); % resize (reposition) legend legend('ResizeLegend',legH); end % elseif the colorbar being deleted is horizontal % set the plothandle y and height to the original Pos % y and height of the colorbar being deleted. % if there is another (vertical) colorbar % do the same to that elseif strncmp(delloc,'horiz',1) phpos(4) = ud.origPos(4); phpos(2) = ud.origPos(2); set(ud.PlotHandle,'position',phpos); if strncmp(otherloc,'vert',1) otherpos(4) = ud.origPos(4); otherpos(2) = ud.origPos(2); set(othercbar,'position',otherpos); end end % restore the plothandle units set(ud.PlotHandle,'units',units); end if isfield(ud,'ColorbarDeleteProxy') & ishandle(ud.ColorbarDeleteProxy) try delete(ud.ColorbarDeleteProxy) end end end % before going, be sure to reset current figure and axes set(0,'currentfigure',GCF); set(gcf,'currentaxes',GCA); return end % If called with COLORBAR(H) or for an existing colorbar, don't change % the NextPlot property. ax = []; cbarinaxis=0; if narg==1 if ishandle(loc) ax = loc; ud = get(ax,'userdata'); if isfield(ud,'ColorbarDeleteProxy') error('Colorbar cannot be added to another colorbar.') end if ~strcmp(get(ax,'type'),'axes') error('Requires axes handle.'); end cbarinaxis=1; units = get(ax,'units'); set(ax,'units','pixels'); rect = get(ax,'position'); set(ax,'units',units); if rect(3) > rect(4) loc = 'horiz'; else loc = 'vert'; end end end % the axes handle, shorter name h = haxes; % Catch attempt to add colorbar to a colorbar or legend % if the axes h is a colorbar or legend (according to tag) % reset it to the PlotHandle field of its userdata tagstr = get(h,'tag'); if strcmpi('Legend',tagstr) | strcmpi('Colorbar',tagstr) ud = get(h,'userdata'); if isfield(ud,'PlotHandle') h = ud.PlotHandle; else % If handle is a dying or mutant colorbar or legend % do nothing. % but before going, be sure to reset current figure and axes set(0,'currentfigure',GCF); set(gcf,'currentaxes',GCA); return; end end % Determine color limits by context. If any axes child is an image % use scale based on size of colormap, otherwise use current CAXIS. ch = get(gcda(hfig,h),'children'); hasimage = 0; t = []; cdatamapping = 'direct'; for i=1:length(ch), typ = get(ch(i),'type'); if strcmp(typ,'image'), hasimage = 1; cdatamapping = get(ch(i), 'CDataMapping'); elseif strcmp(typ,'surface') & ... strcmp(get(ch(i),'FaceColor'),'texturemap') % Texturemapped surf hasimage = 2; cdatamapping = get(ch(i), 'CDataMapping'); elseif strcmp(typ,'patch') | strcmp(typ,'surface') cdatamapping = get(ch(i), 'CDataMapping'); end end if ( strcmp(cdatamapping, 'scaled') ) % Treat images and surfaces alike if cdatamapping == 'scaled' t = caxis(h); d = (t(2) - t(1))/size(colormap(h),1); t = [t(1)+d/2 t(2)-d/2]; else if hasimage, t = [1, size(colormap(h),1)]; else t = [1.5 size(colormap(h),1)+.5]; end end oldloc = 'none'; oldax = []; if ~cbarinaxis % Search for existing colorbar (parents of TMW_COLORBAR tagged images) ch = get(findall(hfig,'type','image','tag','TMW_COLORBAR'),{'parent'}); ax = []; for i=1:length(ch) ud = get(ch{i},'userdata'); d = ud.PlotHandle; % if the plothandle (axis) of the colorbar is our axis if isequal(d,h) pos = get(ch{i},'Position'); if pos(3)<pos(4) oldloc = 'vert'; else oldloc = 'horiz'; end % set ax to the ith colorbar % if it's location (orientation) is the same as the % new colorbar location (so a second colorbar with % the same orientation won't be created, and existing % colorbar will be updated if strncmp(oldloc,loc,1) ax = ch{i}; % Make sure image deletefcn doesn't trigger a colorbar('delete') % for colorbar update - huh? set(findall(ax,'type','image'),'deletefcn','') break; end end end end origNextPlot = get(hfig,'NextPlot'); if strcmp(origNextPlot,'replacechildren') | strcmp(origNextPlot,'replace') set(hfig,'NextPlot','add'); end if loc(1)=='v' % create or refresh vertical colorbar if isempty(ax) %CDM legend('RestoreSize',h); %restore axes to pre-legend size units = get(h,'units'); set(h,'units','normalized'); pos = get(h,'Position'); [az,el] = view(h); %cdm start modification %cdm stripe = 0.075; edge = 0.02; %cdm if all([az,el]==[0 90]) %cdm space = 0.05; %cdm else %cdm space = .1; %cdm end stripe = 0.025; edge = 0.005; if all([az,el]==[0 90]) space = 0.015; else space = .03; end %cdm end modification set(h,'Position',[pos(1) pos(2) pos(3)*(1-stripe-edge-space) pos(4)]); %CDM legend('RecordSize',h); %set this as the new legend fullsize rect = [pos(1)+(1-stripe-edge)*pos(3) pos(2) stripe*pos(3) pos(4)]; ud.origPos = pos; % Create axes for stripe and % create ColorbarDeleteProxy object (an invisible text object in % the target axes) so that the colorbar will be deleted % properly. ud.ColorbarDeleteProxy = text('parent',h,... 'visible','off',... 'tag','ColorbarDeleteProxy',... 'HandleVisibility','off',... 'deletefcn','colorbar(''delete'',''peer'',get(gcbf,''currentaxes''))'); axH = graph3d.colorbar('parent',hfig); set(axH,'position',rect,'Orientation','vert'); ax = double(axH); setappdata(ax,'NonDataObject',[]); % For DATACHILDREN.M set(ud.ColorbarDeleteProxy,'userdata',ax) set(h,'units',units) else axH=[]; ud = get(ax,'userdata'); end % Create color stripe n = size(colormap(h),1); img = image([0 1],t,(1:n)',... 'Parent',ax,... 'Tag','TMW_COLORBAR',... 'deletefcn','colorbar(''delete'',''peer'',get(gcbf,''currentaxes''))',... 'SelectionHighlight','off',... 'HitTest','off'); %set up axes delete function set(ax,... 'Ydir','normal',... 'YAxisLocation','right',... 'xtick',[],... 'tag','Colorbar',... 'deletefcn','colorbar(''delete'',''peer'',get(gcbf,''currentaxes''))'); elseif loc(1)=='h', % create or refresh horizontal colorbar if isempty(ax), legend('RestoreSize',h); %restore axes to pre-legend size units = get(h,'units'); set(h,'units','normalized') pos = get(h,'Position'); %cdm start modification %cdm stripe = 0.075; space = 0.1; stripe = 0.025; space = 0.05; %cdm end modification set(h,'Position',... [pos(1) pos(2)+(stripe+space)*pos(4) pos(3) (1-stripe-space)*pos(4)]) legend('RecordSize',h); %set this as the new legend fullsize rect = [pos(1) pos(2) pos(3) stripe*pos(4)]; ud.origPos = pos; % Create axes for stripe and % create ColorbarDeleteProxy object (an invisible text object in % the target axes) so that the colorbar will be deleted % properly. ud.ColorbarDeleteProxy = text('parent',h,... 'visible','off',... 'tag','ColorbarDeleteProxy',... 'handlevisibility','off',... 'deletefcn','colorbar(''delete'',''peer'',get(gcbf,''currentaxes''))'); axH = graph3d.colorbar('parent',hfig); set(axH,'Orientation','horiz'); set(axH,'position',rect); ax = double(axH); setappdata(ax,'NonDataObject',[]); % For DATACHILDREN.M set(ud.ColorbarDeleteProxy,'userdata',ax) set(h,'units',units) else axH=[]; ud = get(ax,'userdata'); end % Create color stripe n = size(colormap(h),1); img=image(t,[0 1],(1:n),... 'Parent',ax,... 'Tag','TMW_COLORBAR',... 'deletefcn','colorbar(''delete'',''peer'',get(gcbf,''currentaxes''))',... 'SelectionHighlight','off',... 'HitTest','off'); % set up axes deletefcn set(ax,... 'Ydir','normal',... 'Ytick',[],... 'tag','Colorbar',... 'deletefcn','colorbar(''delete'',''peer'',get(gcbf,''currentaxes''))') else error('COLORBAR expects a handle, ''vert'', or ''horiz'' as input.') end if ~isfield(ud,'ColorbarDeleteProxy') ud.ColorbarDeleteProxy = []; end if ~isfield(ud,'origPos') ud.origPos = []; end ud.PlotHandle = h; set(ax,'userdata',ud) set(hfig,'NextPlot',origNextPlot) legH=legend(h); if ~isempty(legH) & ishandle(legH) % resize (reposition) legend legend('ResizeLegend',legH); axes(legH); end %make sure annotation layer ends up on top. plotedit(get(ax,'parent'),'promoteoverlay'); if nargout>0 handle = ax; end % Finally, before going, be sure to reset current figure and axes set(0,'currentfigure',GCF); set(gcf,'currentaxes',GCA); %-------------------------------- function h = gcda(hfig, haxes) %GCDA Get current data axes h = datachildren(hfig); if isempty(h) | any(h == haxes) h = haxes; else h = h(1); end