Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_recolorbar.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/somtoolbox/som_recolorbar.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,351 @@ +function h=som_recolorbar(p, ticks, scale, labels) + +%SOM_RECOLORBAR Refresh and rescale colorbars in the current SOM_SHOW fig. +% +% h = som_recolorbar([p], [ticks], [scaling], [labels]) +% +% colormap(jet); som_recolorbar +% +% Input and output arguments ([]'s are optional) +% [p] (vector) subplot number vector +% (string) 'all' (the default), 'comp' to process only +% component planes +% [ticks] (string) 'auto' or 'border', default: 'auto' +% (cell array) p x 1 cell array of p row vectors +% (vector) the same ticks are applied to all given subplots +% (scalar) value is at least 2: the number of ticks to show, +% evenly spaced between and including minimum and maximum +% [scale] (string) 'denormalized' or 'normalized' (the default) +% [labels] (cell array) p x 1 cell array of cells containing strings +% +% h (vector) handles to the colorbar objects. +% +% This function refreshes the colorbars in the figure created by SOM_SHOW. +% Refreshing is necessary if you have changed the colormap. +% Each colorbar has letter 'd' or 'n' and possibly 'u' as label. Letter 'd' means +% that the scale is denormalized, letter 'n' that the scale is +% normalized, and 'u' is for user specified labels. +% +% For more help, try 'type som_recolorbar' or check out online documentation. +% See also SOM_SHOW + +%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% som_recolorbar +% +% PURPOSE +% +% Refreshes the the colorbars in the figure. +% +% SYNTAX +% +% h = som_recolorbar +% h = som_recolorbar(p) +% h = som_recolorbar(p, ticks) +% h = som_recolorbar(p, ticks, scaling) +% h = som_recolorbar(p, ticks, scaling, labels) +% +% DESCRIPTION +% +% This function refreshes the colorbars in the figure created by SOM_SHOW. +% Refreshing is necessary if you have changed the colormap. Each colorbar +% has letter 'd' or 'n' and possibly 'u' as label. Letter 'd' means that the +% scale is denormalized, letter 'n' that the scale is normalized, and 'u' is +% for user specified labels. +% +% Different argument combinations: +% +% 1. Argument 'ticks' has string values: +% - 'auto' for input argument ticks sets the automatic tick +% marking on (factory default). +% - 'border' sets the tick marks to the color borders. This is +% convenient if there are only few colors in use. +% +% Argument scale controls the scaling of the tick mark label values. +% 'normalized' means that the tick mark labels are directly the values +% of the ticks, that is, they refer to the map codebook values. +% Value 'denormalized' scales the tick mark label values back to the original +% data scaling. This is made using som_denormalize_data. +% +% 2. Argument 'ticks' is a cell array of vectors: +% The values are set to be the tick marks to the colorbar specified by p. +% - if arg. scale is 'normalized' the ticks are set directly to the colorbar. +% - if arg. scale is 'denormalized' the tick values are first normalized +% in the same way as the data. +% +% 3. Argument 'ticks' is a vector +% As above, but the same values are used for all (given) subplots. +% +% 4. Argument 'ticks' is a scalar +% The ticks are set to equally spaced values between (and including) +% minimum and maximum. +% +% Argument 'labels' specify user defined labels to the tick marks +% +% NOTE: ticks are rounded to contain three significant digits. +% +% OPTIONAL INPUT ARGUMENTS +% +% p (vector) subplot number vector +% (string) 'all' (the default), 'comp' to effect only +% component planes +% +% ticks (string) 'auto' or 'border', default: 'auto' +% (cell array) p x 1 cell array of p row vectors +% (vector) as the cell array, but the same vector is +% applied to all given subplots +% (scalar) the number of ticks to show: these are +% evenly space between minimum and maximum +% +% scale (string) 'denormalized' or 'normalized' (the default) +% +% labels (cell array) p x 1 cell array of cells containing strings +% +% OUTPUT ARGUMENTS +% +% h (vector) handles to the colorbar objects. +% +% EXAMPLE +% +% colormap(jet(5)); som_recolorbar('all','border','denormalized') +% % Uses five colors and sets the ticks on the color borders. +% % Tick label values are denormalized back to the original data scaling +% +% colormap(copper(64));som_recolorbar +% % changes to colormap copper and resets default ticking and labeling +% +% som_recolorbar('all',3) +% % To put 3 ticks to each colorbar so that minimum, mean and +% % maximum values on the colorbar are shown. +% +% som_recolorbar([1 3],{[0.1 0.2 0.3];[0.2 0.4]},'denormalized') +% % Ticks colorbar 1 by first normalizing values 0.1, 0.2, 0.3 and +% % then setting the ticks to the colorbar. Labels are of course +% % 0.1, 0.2 and 0.3. Ticks colorbar 3 in the same way using values +% % 0.2 and 0.4. +% +% som_recolorbar([2 4],{[0.1 0.2];[-1.2 3]},'normalized',{{'1' '2'};{'a' 'b'}}) +% % Ticks colorbar 2 and 4 directly to the specified values. Sets labels +% % '1' '2' and 'a' 'b' to the ticks. +% +% som_recolorbar([2 4],{[0.1 0.2];[-1.2 3]},'normalized',{{'1' '2'};{'a' 'b'}}) +% % as previous one, but normalizes tick values first +% +% SEE ALSO +% +% som_show Basic SOM visualization. +% som_normalize Normalization operations. +% som_denormalize Denormalization operations. + +% Copyright (c) 1997-2000 by the SOM toolbox programming team. +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Version 1.0beta Johan 061197 +% Version 2.0beta juuso 151199 130300 160600 181101 + +%% Init & check %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +error(nargchk(0, 4, nargin)) % check no. of input args + +% Check the subplot vector p and get the handles, exit if error +% Default subplot vector is 'all' + +if nargin < 1 | isempty(p) % default p + p= 'all'; +end + +% check SOM_SHOW and get the figure data. Exit, if error + +[handles, msg, lattice, msize, dim, normalization, comps]= ... + vis_som_show_data(p, gcf); +error(msg); + +if nargin < 2 | isempty(ticks) % default tick mode is 'auto' + ticks = 'auto'; +elseif isa(ticks,'cell') % check for cell + tickValues = ticks; + ticks= 'explicit'; +elseif isa(ticks,'double') & length(ticks)>1, + tickValues = {ticks}; + ticks = 'explicit'; +elseif isa(ticks,'double') & length(ticks)==1, + tickValues = max(2,round(ticks)); + ticks = 'evenspace'; +end +if ~ischar(ticks) % invalid argument + error('The second argument should be a string or a cell array of vectors.'); +end + +switch ticks % check ticks + case {'auto','border'}, % nill + case 'evenspace', + tickValues_tmp = cell(length(handles),1); + for i=1:length(handles), tickValues_tmp{i} = tickValues; end + tickValues = tickValues_tmp; + case 'explicit', + if length(tickValues)==1 & length(handles)>1, + tickValues_tmp = cell(length(handles),1); + for i=1:length(handles), tickValues_tmp{i} = tickValues{1}; end + tickValues = tickValues_tmp; + end + if length(tickValues) ~= length(handles), + error('Cell containing the ticks has wrong size.') + end +otherwise + error('''auto'' or ''border'' expected for the second argument.'); +end + +if nargin < 3 | isempty(scale) % default mode is normalized + scale= 'normalized'; +end +if ~ischar(scale) % check scale type + error('The third argument should be a string.'); +end +switch scale % check the string + case { 'normalized', 'denormalized'} % ok + case 'n', scale = 'normalized'; + case 'd', scale = 'denormalized'; + otherwise + error('''normalized'' or ''denormalized'' expected for the third argument.') +end + +if nargin < 4 | isempty(labels) % default is autolabeling + labels = 'auto'; +elseif ~isa(labels,'cell') % check type + error('The fourth argument should be a cell array of cells containing strings.') +else + labelValues=labels; % set labels + labels = 'explicit'; + if length(labelValues) == length(handles) % check size + ; + else + error('Cell containing the labels has wrong size') + end +end + +%% Action %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +n = size(colormap,1)+1; % number of colors+1 +h_ = zeros(length(handles),1); + +for i=1:length(handles), % MAIN LOOP BEGINS + axes(handles(i)); % set axes, refres colorbar and + if comps(i)>=0, + h_(i)=colorbar; % get colorbar handles + + colorbardir=get(h_(i),'YaxisLocation'); + switch colorbardir % get colorbar direction & + case 'left' % set some strings + Tick='Xtick'; Lim='Xlim'; LabelMode='XTickLabelMode'; Label='XtickLabel'; + case 'right' + Tick='Ytick'; Lim='Ylim'; LabelMode='YTickLabelMode'; Label='YtickLabel'; + otherwise + error('Internal error: unknown value for YaxisLocation'); % fatal + end + + switch ticks + case 'auto' + set(h_(i),LabelMode,'auto'); % factory default ticking + tickValues{i}=get(h_(i),Tick); % get tick values + case 'border' + limit=caxis; + t=linspace(limit(1),limit(2),n); % set n ticks between min and max + t([1 length(t)])=get(h_(i),Lim); % <- caxis is not necerraily the same + tickValues{i}=t; % as the colorbar min & max values + case 'evenspace' + limit = caxis; + t = linspace(limit(1),limit(2),tickValues{i}); + t([1 length(t)])=get(h_(i),Lim); + tickValues{i}=t; + case 'explicit' + if comps(i)>0, + if strcmp(scale,'normalized') % normalize tick values + tickValues{i} = som_normalize(tickValues{i},normalization{comps(i)}); + end + end + + otherwise + error('Internal error: unknown tick type') % this shouldn't happen + end + + %tickValues{i} = epsto0(tickValues{i}); + + switch labels + case 'auto' + switch scale + case 'normalized' + labelValues{i} = round2(tickValues{i}); % use the raw ones + case 'denormalized' % denormalize tick values + if comps(i)>0, + labelValues{i} = som_denormalize(tickValues{i},normalization{comps(i)}); + labelValues{i} = round2(labelValues{i}); % round the scale + else + labelValues{i} = round2(tickValues{i}); + end + otherwise + error('Internal error: unknown scale type'); % this shouldn't happen + end + case 'explicit' + ; % they are there already + otherwise + error('Internal error: unknown label type'); % this shouldn't happen + end + + set(h_(i),Tick,tickValues{i}); % set ticks and labels + set(h_(i),Label,labelValues{i}); + + if comps(i)>0, + % Label the colorbar with letter 'n' if normalized, with letter 'd' + % if denormalized and 'u' if the labels are user specified + mem_axes=gca; axes(h_(i)); + ch=' '; + if strcmp(scale,'normalized'), ch(1)='n'; end + if strcmp(scale,'denormalized'), ch(1)='d'; end + if strcmp(labels,'explicit'), ch(2)='u'; end + xlabel(ch); + axes(mem_axes); + end + end +end % MAIN LOOP ENDS + + +%% Build output %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if nargout>0 + h=h_; +end + +return; + +%% Subfunction: ROUND2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% ROUND2 rounds the labels to tol significant digits + +function r=round2(d) + +tol=3; + +zero=(d==0); +d(zero)=1; +k=floor(log10(abs(d)))-(tol-1); +r=round(d./10.^k).*10.^k; +r(zero)=0; +%r=epsto0(r); + +%% Subfunction: ISVECTOR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function t=isvector(v) +% ISVECTOR checks if a matrix is a vector or not + +t=(ndims(v) == 2 & min(size(v)) == 1) & isnumeric(v); + +%% Subfunction: EPSTO0 + +function t=epsto0(t) +% EPSTO0 checks whether first tick value is *very* close to zero, +% if so sets it to zero. + +if (t(end)-t(1))/t(end) > 1-0.005 & abs(t(1))<1, t(1) = 0; end + + + +