comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:e9a9cd732c1e
1 function colors=som_colorcode(m, colorcode, scaling)
2
3 %SOM_COLORCODE Calculates a heuristic color coding for the SOM grid
4 %
5 % colors = som_colorcode(m, colorcode, scaling)
6 %
7 % Input and output arguments ([]'s are optional):
8 % m (struct) map or topol struct
9 % (cell array) of form {str,[m1 m2]} where
10 % str = 'hexa' or 'rect' and [m1 m2] = msize
11 % (matrix) size N x 2, unit coordinates
12 % [colorcode] (string) 'rgb1' (default),'rgb2','rgb3','rgb4','hsv'
13 % [scaling] (scalar) 1=on (default), 0=off. Has effect only
14 % if m is a Nx2 matrix of coordinates:
15 % controls whether these are scaled to
16 % range [0,1] or not.
17 %
18 % colors (matrix) size N x 3, RGB colors for each unit (or point)
19 %
20 % The function gives a color coding by location for the map grid
21 % (or arbitrary set of points). Map grid coordinates are always linearly
22 % normalized to a unit square (x and y coordinates between [0,1]), except
23 % if m is a Nx2 matrix and scaling=0. In that case too, the coordinates
24 % must be in range [0,1].
25 %
26 % Following heuristic color codings are available:
27 %
28 % 'rgb1' slice of RGB-cube so that green - yellow
29 % the corners have colors: | |
30 % blue - magenta
31 %
32 % 'rgb2' slice of RGB-cube so that red - yellow
33 % the corners have colors: | |
34 % blue - cyan
35 %
36 % 'rgb3' slice of RGB-cube so that mixed_green - orange
37 % the corners have colors: | |
38 % light_blue - pink
39 %
40 % 'rgb4' has 'rgb1' on the diagonal + additional colors in corners
41 % (more resolution but visually strongly discontinuous)
42 %
43 % 'hsv' angle and radius from map centre are coded by hue and
44 % intensity (more resoluton but visually discontinuous)
45 %
46 % See also SOM_CPLANE, SOM_SHOW, SOM_CLUSTERCOLOR, SOM_KMEANSCOLOR,
47 % SOM_BMUCOLOR.
48
49 % Contributed to SOM Toolbox 2.0, February 11th, 2000 by Johan Himberg
50 % Copyright (c) by Johan Himberg
51 % http://www.cis.hut.fi/projects/somtoolbox/
52
53 % Version 2.0 Johan 140799
54
55 %%% Check arguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56
57 error(nargchk(1, 3, nargin)); % check no. of input args is correct
58
59 %% Check m: map, topol, cell or data?
60
61 if vis_valuetype(m,{'nx2'}),
62 p=m; % explicit coordinates
63
64 else
65
66 % map, topol, cell
67
68 [tmp,ok,tmp]=som_set(m);
69 if isstruct(m) & all(ok)
70 switch m.type
71 case 'som_topol' % topol
72 msize=m.msize;
73 lattice=m.lattice;
74 case 'som_map'
75 msize=m.topol.msize; % map
76 lattice=m.topol.lattice;
77 otherwise
78 error('Invalid map or topol struct.');
79 end
80
81 % cell
82
83 elseif iscell(m) & vis_valuetype(size(m),{[1 2]}),
84 if vis_valuetype(m{2},{[1 2]}) & vis_valuetype(m{1},{'string'}),
85 lattice=m{1};
86 msize=m{2};
87 else
88 error('Invalid map size information.');
89 end
90 end
91
92 %% Check map parameters
93
94 switch lattice % lattice
95 case 'hexa'
96 ;
97 case 'rect'
98 ;
99 otherwise
100 error('Unknown lattice type');
101 end
102
103 if length(msize)>2 % dimension
104 error('Only 2D maps allowed!');
105 end
106
107
108 % Calculate coordinates
109 p=som_unit_coords(msize,lattice,'sheet');
110
111 % Set scaling to 1 as it is done always in this case
112 scaling=1;
113 end
114
115 % Check colorcode
116
117 if nargin < 2 | isempty(colorcode),
118 colorcode='rgb1';
119 end
120 if ~ischar(colorcode)
121 error('String value for colorcode mode expected.');
122 else
123 switch colorcode
124 case { 'rgb1', 'rgb2', 'rgb3' , 'rgb4' ,'hsv'}
125 otherwise
126 error([ 'Colorcode mode ' colorcode ' not implemented.']);
127 end
128 end
129
130 % Check scaling
131
132 if nargin < 3 | isempty(scaling)
133 scaling=1;
134 end
135
136 if ~vis_valuetype(scaling,{'1x1'})
137 error('Scaling should be 0 (off) or 1 (on).');
138 end
139
140 %% Action %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
141
142 % scale coordintes between [0,1]
143
144 if scaling
145 n=size(p,1);
146 mn=min(p);
147 e=max(p)-mn;
148 p=(p-repmat(mn,n,1))./repmat(e,n,1);
149 elseif sum(p(:,1)>1+p(:,1)<0+p(:,2)>1+p(:,2)<0),
150 error('Coordinates out of range [0,1].');
151 end
152
153 switch colorcode
154 case 'rgb1'
155 h(:,1)=p(:,1);
156 h(:,2)=1-p(:,2);
157 h(:,3)=p(:,2);
158 case 'rgb2'
159 h(:,1)=p(:,1);
160 h(:,2)=1-p(:,2);
161 h(:,3)=1-p(:,1);
162 case 'rgb3'
163 h(:,1)=p(:,1);
164 h(:,2)=.5;
165 h(:,3)=p(:,2);
166 case 'rgb4'
167 p=rgb4(p);
168 h(:,1)=p(:,1);
169 h(:,2)=1-p(:,2);
170 h(:,3)=p(:,3);
171 case 'hsv'
172 munits = n;
173 Hsv = zeros(munits,3);
174 for i=1:n,
175 dx = .5-p(i,1);
176 dy = .5-p(i,2);
177 r = sqrt(dx^2+dy^2);
178 if r==0,
179 h=1;
180 elseif dx==0,
181 h=.5; %h=ay;
182 elseif dy==0,
183 h=.5; %h=ax;
184 else
185 h = min(abs(.5/(dx/r)),abs(.5/(dy/r)));
186 end
187
188 if r==0,
189 angle = 0;
190 else
191 angle = acos(dx/r);
192 if dy<0,
193 angle = 2*pi-angle;
194 end
195 end
196
197 Hsv(i,1) = 1-sin(angle/4);
198 Hsv(i,2) = 1;
199 Hsv(i,3) = r/h;
200 h = hsv2rgb(Hsv);
201 end
202 end
203
204
205 %% Build output %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
206
207 colors=h;
208
209 %% Subfunctions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% juha %%%%
210
211 function p=rgb4(coord)
212
213 for i=1:size(coord,1);
214 p(i,:)=get_coords(coord(i,:))';
215 end
216
217 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
218
219 function coords=get_coords(coords)
220
221 %GET_COORDS
222 %
223 % get_coords(coords)
224 %
225 % ARGUMENTS
226 %
227 % coords (1x2 or 2x1 vector) coords(1) is an x-coordinate and coords(2)
228 % y-coordinate.
229 %
230 %
231 % RETURNS
232 %
233 % coords (3x1 vector) x,y and z-coordinates.
234 %
235
236 if ~(all(size(coords) == [1 2]) | all(size(coords) == [2 1]))
237 error('Argument ''coords'' must be an 2x1 or 1x2 vector.');
238 end
239
240 if all(size(coords) == [1 2])
241 coords=coords';
242 end
243
244 if any(coords > 1) any(coords < 0)
245 error('Coordinates must lay inside the interval [0,1].');
246 end
247
248 if coords(1) <= 1/(sqrt(2)+1),
249 if coords(2) <= line3(coords(1))
250 coords=coords_in_base(4,coords);
251 elseif coords(2) <= line2(coords(1))
252 coords=coords_in_base(1,coords);
253 else
254 coords=coords_in_base(2,coords);
255 end
256 elseif coords(1) <= sqrt(2)/(sqrt(2)+1)
257 if coords(2) <= line1(coords(1))
258 coords=coords_in_base(3,coords);
259 elseif coords(2) <= line2(coords(1))
260 coords=coords_in_base(1,coords);
261 else
262 coords=coords_in_base(2,coords);
263 end
264 else
265 if coords(2) <= line1(coords(1)),
266 coords=coords_in_base(3,coords);
267 elseif coords(2) <= line4(coords(1))
268 coords=coords_in_base(1,coords);
269 else
270 coords=coords_in_base(5,coords);
271 end
272 end
273
274
275 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
276
277 function coords=coords_in_base(base_no,coords)
278
279 A=[0;1/(sqrt(2)+1)];
280 E=[1;1];
281 F=[0;0];
282 G=[1;0];
283 H=[0;1];
284
285 const=1+1/sqrt(2);
286
287 switch base_no
288 case 1
289 x=(coords-A)*const;
290 coords=[(1/sqrt(2))*(x(1)-x(2));0.5*(x(1)+x(2));0.5*(x(1)+x(2))];
291 case 2
292 x=(coords-H)*const;
293 coords=[0;x(1);1+x(2)];
294 case 3
295 x=(coords-G)*const;
296 coords=[1;1+x(1);x(2)];
297 case 4
298 x=(coords-F)*const;
299 coords=[0.5+(1/sqrt(2))*(x(1)-x(2));...
300 0.5-(1/sqrt(2))*(x(1)+x(2));...
301 0];
302 case 5
303 x=(coords-E)*const;
304 coords=[0.5+(1/sqrt(2))*(x(1)-x(2));...
305 0.5-(1/sqrt(2))*(x(1)+x(2));...
306 1];
307 end
308
309 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
310
311 function y=line1(x)
312
313 y = x-1/(sqrt(2)+1);
314
315 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
316
317 function y=line2(x)
318
319 y = x+1/(sqrt(2)+1);
320
321 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
322
323 function y=line3(x)
324
325 y = -x+1/(sqrt(2)+1);
326
327 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
328
329 function y= line4(x)
330
331 y = -x+(2*sqrt(2)+1)/(sqrt(2)+1);
332
333 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%