wolffd@0: function Col = som_coloring(sM,ncol,chaingap,dw) wolffd@0: wolffd@0: % SOM_COLORING Make a SOM-based coloring for given data/map. wolffd@0: % wolffd@0: % Col = som_coloring(sM,[ncol],[chaingap],[dw]) wolffd@0: % wolffd@0: % Col = som_coloring(sM,5); wolffd@0: % som_show(sM,'color',Col); wolffd@0: % wolffd@0: % Input and output arguments ([]'s are optional): wolffd@0: % sM (struct) map or data struct wolffd@0: % (matrix) data matrix wolffd@0: % [ncol] (scalar) number of colors to use wolffd@0: % [chaingap] (scalar) size of gap in the color circle (see below), wolffd@0: % 0.1 by default wolffd@0: % [dw] (scalar) 1 = use input space distances to stretch wolffd@0: % the color circle (default) wolffd@0: % 0 = don't use wolffd@0: % wolffd@0: % Col (matrix) color for each data/codebook vector wolffd@0: % wolffd@0: % This function trains a 1-dimensional SOM using the input data wolffd@0: % (codebook of a SOM, or a set of data vectors). A color from the wolffd@0: % color circle (see HSV function) is associated with each map unit, wolffd@0: % and each data/codebook vector of the input data picks its color wolffd@0: % from its BMU on the 1-dimensional SOM. wolffd@0: % wolffd@0: % If the chaingap argument == 0, the 1-dimensional map has a cylinder wolffd@0: % (in effect, a ring) topology. Otherwise, the topology is rectangular wolffd@0: % (in effect, a chain). wolffd@0: % wolffd@0: % The colors are mapped to the 1-dimensional SOM simply by picking colors wolffd@0: % from the color circle. If chaingap>0, a slice of the color circle is wolffd@0: % removed before map units pick their colors from it. This creates a wolffd@0: % discontiuity in the coloring at the ends of the 1-dimensional SOM. wolffd@0: % wolffd@0: % If the dw argument == 0, the colors are picked from the color circle wolffd@0: % equidistantly. If not, the distances between the prototype vectors wolffd@0: % in the 1-dimensional SOM are taken into account. wolffd@0: % wolffd@0: % See also SOM_KMEANSCOLOR, SOM_KMEANSCOLOR2, SOM_FUZZYCOLOR. wolffd@0: wolffd@0: % Contributed to SOM Toolbox 2.0, December 21st, 2001 by Juha Vesanto wolffd@0: % http://www.cis.hut.fi/projects/somtoolbox/ wolffd@0: wolffd@0: % Version 2.0beta juuso 211201 wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: if isstruct(sM), wolffd@0: if strcmp(sM.type,'som_map'), ismap = 1; D = sM.codebook; wolffd@0: else ismap = 0; D = sM.data; wolffd@0: end wolffd@0: else ismap = 0; D = sM; wolffd@0: end wolffd@0: wolffd@0: if nargin<2 | isempty(ncol) | isnan(ncol), ncol = min(64,size(D,1)); end wolffd@0: if nargin<3 | isempty(chaingap) | isnan(chaingap), chaingap = 0.1; end wolffd@0: if nargin<4 | isempty(dw) | isnan(dw), dw = 1; end wolffd@0: wolffd@0: if chaingap == 0, lattice = 'sheet'; else lattice = 'cyl'; end wolffd@0: sMring = som_make(D,'msize',[1,ncol],lattice,'tracking',0); wolffd@0: b = som_bmus(sMring,D); wolffd@0: wolffd@0: Colmap = hsv(ceil(ncol*(1+chaingap))); wolffd@0: Colmap = Colmap(1:ncol,:); wolffd@0: wolffd@0: if dw, % take distances in input space into account wolffd@0: dist = sqrt(sum((sMring.codebook-sMring.codebook([2:end 1],:)).^2,2)); wolffd@0: ind = round([0; cumsum(dist)/sum(dist)]*(ncol-1)) + 1; wolffd@0: Colmap = Colmap(ind,:); wolffd@0: end wolffd@0: Col = Colmap(b,:); wolffd@0: wolffd@0: return; wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: % visualization wolffd@0: if ismap, wolffd@0: a = som_bmus(sM.codebook,sMring.codebook); wolffd@0: if chaingap==0, a(end+1) = a(1); end wolffd@0: som_show(sM,'color',Col); wolffd@0: som_show_add('traj',a) wolffd@0: else wolffd@0: i = find(sum(isnan(D),2)==0); wolffd@0: [P,V,me] = pcaproj(D(i,:),2); wolffd@0: Pr = pcaproj(sMring.codebook,V,me); wolffd@0: a = som_bmus(D(i,:),sMring.codebook); % Pr = P(a,:); wolffd@0: som_grid({'rect',[length(i) 1]},'line','none',... wolffd@0: 'coord',P,'markercolor',Col(i,:)); wolffd@0: hold on wolffd@0: if chaingap==0, Pr(end+1,:) = Pr(1,:); end wolffd@0: som_grid({'rect',[size(Pr,1) 1]},'linecolor','k',... wolffd@0: 'linewidth',2,'markercolor','k','coord',Pr); wolffd@0: end wolffd@0: wolffd@0: