diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_colorcode.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_colorcode.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,333 @@
+function colors=som_colorcode(m, colorcode, scaling)
+
+%SOM_COLORCODE Calculates a heuristic color coding for the SOM grid
+%
+% colors = som_colorcode(m, colorcode, scaling) 
+%
+%  Input and output arguments ([]'s are optional):
+%   m           (struct) map or topol struct
+%               (cell array) of form {str,[m1 m2]} where 
+%                        str = 'hexa' or 'rect' and [m1 m2] = msize
+%               (matrix) size N x 2, unit coordinates 
+%   [colorcode] (string) 'rgb1' (default),'rgb2','rgb3','rgb4','hsv'  
+%   [scaling]   (scalar) 1=on (default), 0=off. Has effect only
+%                        if m is a Nx2 matrix of coordinates: 
+%                        controls whether these are scaled to 
+%                        range [0,1] or not.
+%
+%   colors      (matrix) size N x 3, RGB colors for each unit (or point)
+%
+% The function gives a color coding by location for the map grid 
+% (or arbitrary set of points). Map grid coordinates are always linearly 
+% normalized to a unit square (x and y coordinates between [0,1]), except
+% if m is a Nx2 matrix and scaling=0. In that case too, the coordinates
+% must be in range [0,1].
+% 
+% Following heuristic color codings are available:
+%
+%  'rgb1' slice of RGB-cube so that       green - yellow
+%         the corners have colors:          |       |
+%                                         blue  - magenta
+%
+%  'rgb2' slice of RGB-cube so that       red   - yellow
+%         the corners have colors:          |       |
+%                                         blue  - cyan   
+%
+%  'rgb3' slice of RGB-cube so that   mixed_green - orange
+%         the corners have colors:          |        |
+%                                     light_blue  - pink 
+%
+%  'rgb4' has 'rgb1' on the diagonal + additional colors in corners
+%         (more resolution but visually strongly discontinuous) 
+%
+%  'hsv'  angle and radius from map centre are coded by hue and 
+%         intensity (more resoluton but visually discontinuous)
+%
+% See also SOM_CPLANE, SOM_SHOW, SOM_CLUSTERCOLOR, SOM_KMEANSCOLOR, 
+%          SOM_BMUCOLOR.
+
+% Contributed to SOM Toolbox 2.0, February 11th, 2000 by Johan Himberg
+% Copyright (c) by Johan Himberg
+% http://www.cis.hut.fi/projects/somtoolbox/
+
+% Version 2.0 Johan 140799 
+
+%%% Check arguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+error(nargchk(1, 3, nargin));   % check no. of input args is correct
+
+%% Check m: map, topol, cell or data?
+
+if vis_valuetype(m,{'nx2'}),
+  p=m;  % explicit coordinates
+  
+else
+  
+  % map, topol, cell
+  
+  [tmp,ok,tmp]=som_set(m);
+  if isstruct(m) & all(ok)
+    switch m.type
+    case 'som_topol'              % topol 
+      msize=m.msize;
+      lattice=m.lattice;
+    case 'som_map'   
+      msize=m.topol.msize;        % map
+      lattice=m.topol.lattice;
+    otherwise
+      error('Invalid map or topol struct.');
+    end
+
+  % cell  
+    
+  elseif iscell(m) & vis_valuetype(size(m),{[1 2]}),
+    if vis_valuetype(m{2},{[1 2]}) & vis_valuetype(m{1},{'string'}),
+      lattice=m{1};    
+      msize=m{2}; 
+    else
+      error('Invalid map size information.');
+    end
+  end
+
+  %% Check map parameters
+ 
+  switch lattice                   % lattice  
+  case 'hexa' 
+    ;
+  case 'rect'
+    ;
+  otherwise
+    error('Unknown lattice type');
+  end
+  
+  if length(msize)>2                % dimension
+    error('Only 2D maps allowed!');
+  end
+  
+                                     
+  % Calculate coordinates 
+  p=som_unit_coords(msize,lattice,'sheet');
+
+  % Set scaling to 1 as it is done always in this case
+  scaling=1;   
+end
+
+% Check colorcode
+
+if nargin < 2 | isempty(colorcode),
+  colorcode='rgb1';
+end
+if ~ischar(colorcode)
+  error('String value for colorcode mode expected.');
+else
+ switch colorcode
+ case { 'rgb1', 'rgb2', 'rgb3' , 'rgb4' ,'hsv'}
+  otherwise
+    error([ 'Colorcode mode ' colorcode ' not implemented.']);
+  end
+end
+
+% Check scaling
+
+if nargin < 3 | isempty(scaling) 
+  scaling=1;
+end
+
+if ~vis_valuetype(scaling,{'1x1'})
+  error('Scaling should be 0 (off) or 1 (on).');
+end
+
+%% Action %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% scale coordintes between [0,1]
+
+if scaling  
+  n=size(p,1);
+  mn=min(p);
+  e=max(p)-mn;
+  p=(p-repmat(mn,n,1))./repmat(e,n,1);
+elseif sum(p(:,1)>1+p(:,1)<0+p(:,2)>1+p(:,2)<0),  
+  error('Coordinates out of range [0,1].');
+end
+
+switch colorcode 
+case 'rgb1'
+  h(:,1)=p(:,1);
+  h(:,2)=1-p(:,2);
+  h(:,3)=p(:,2);
+case 'rgb2'
+  h(:,1)=p(:,1);
+  h(:,2)=1-p(:,2);
+  h(:,3)=1-p(:,1);
+case 'rgb3'
+  h(:,1)=p(:,1);
+  h(:,2)=.5;
+  h(:,3)=p(:,2);
+case 'rgb4'  
+ p=rgb4(p);
+ h(:,1)=p(:,1);
+ h(:,2)=1-p(:,2);
+ h(:,3)=p(:,3);
+case 'hsv'
+  munits = n;
+  Hsv = zeros(munits,3);
+  for i=1:n, 
+    dx = .5-p(i,1);
+    dy = .5-p(i,2);
+    r = sqrt(dx^2+dy^2);
+    if r==0, 
+      h=1; 
+    elseif dx==0, 
+      h=.5; %h=ay; 
+    elseif dy==0, 
+      h=.5; %h=ax; 
+    else 
+      h = min(abs(.5/(dx/r)),abs(.5/(dy/r))); 
+    end
+    
+    if r==0, 
+      angle = 0; 
+    else 
+      angle = acos(dx/r); 
+      if dy<0, 
+	angle = 2*pi-angle; 
+      end
+    end
+    
+    Hsv(i,1) = 1-sin(angle/4);
+    Hsv(i,2) = 1;
+    Hsv(i,3) = r/h; 
+    h = hsv2rgb(Hsv);
+  end
+end
+
+
+%% Build output %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+colors=h;
+
+%% Subfunctions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% juha %%%%
+
+function p=rgb4(coord)
+
+for i=1:size(coord,1);
+ p(i,:)=get_coords(coord(i,:))';
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function coords=get_coords(coords)
+
+%GET_COORDS
+%
+% get_coords(coords)
+%
+% ARGUMENTS
+%
+% coords (1x2 or 2x1 vector) coords(1) is an x-coordinate and coords(2)
+%                            y-coordinate.
+%
+%
+% RETURNS
+%
+% coords (3x1 vector) x,y and z-coordinates.
+%
+
+if ~(all(size(coords) == [1 2]) | all(size(coords) == [2 1]))
+  error('Argument ''coords'' must be an 2x1 or 1x2 vector.');
+end
+
+if all(size(coords) == [1 2])
+  coords=coords';
+end
+
+if any(coords > 1) any(coords < 0)
+  error('Coordinates must lay inside the interval [0,1].');
+end
+
+if coords(1) <= 1/(sqrt(2)+1),
+  if coords(2) <= line3(coords(1))
+    coords=coords_in_base(4,coords);
+  elseif coords(2) <= line2(coords(1))
+    coords=coords_in_base(1,coords);
+  else
+    coords=coords_in_base(2,coords);
+  end
+elseif coords(1) <= sqrt(2)/(sqrt(2)+1)
+  if coords(2) <= line1(coords(1))
+    coords=coords_in_base(3,coords);
+  elseif coords(2) <= line2(coords(1))
+    coords=coords_in_base(1,coords);
+  else
+    coords=coords_in_base(2,coords);
+  end
+else
+  if coords(2) <= line1(coords(1)),
+    coords=coords_in_base(3,coords);
+  elseif coords(2) <= line4(coords(1))
+    coords=coords_in_base(1,coords);
+  else
+    coords=coords_in_base(5,coords);
+  end
+end
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function coords=coords_in_base(base_no,coords)
+
+A=[0;1/(sqrt(2)+1)];
+E=[1;1];
+F=[0;0];
+G=[1;0];
+H=[0;1];
+
+const=1+1/sqrt(2);
+
+switch base_no
+  case 1
+    x=(coords-A)*const;
+    coords=[(1/sqrt(2))*(x(1)-x(2));0.5*(x(1)+x(2));0.5*(x(1)+x(2))];
+  case 2
+    x=(coords-H)*const;
+    coords=[0;x(1);1+x(2)];
+  case 3
+    x=(coords-G)*const;
+    coords=[1;1+x(1);x(2)];
+  case 4
+    x=(coords-F)*const;
+    coords=[0.5+(1/sqrt(2))*(x(1)-x(2));...
+            0.5-(1/sqrt(2))*(x(1)+x(2));... 
+            0];
+  case 5
+    x=(coords-E)*const;
+    coords=[0.5+(1/sqrt(2))*(x(1)-x(2));...
+            0.5-(1/sqrt(2))*(x(1)+x(2));...      
+            1];
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function y=line1(x)
+  
+y = x-1/(sqrt(2)+1);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function y=line2(x)
+
+y = x+1/(sqrt(2)+1);
+ 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function y=line3(x)
+
+y = -x+1/(sqrt(2)+1);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function y= line4(x)
+
+y = -x+(2*sqrt(2)+1)/(sqrt(2)+1);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%