Mercurial > hg > camir-aes2014
comparison toolboxes/MIRtoolbox1.3.2/somtoolbox/som_clplot.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 h = som_clplot(sC,varargin) | |
| 2 | |
| 3 %SOM_CLPLOT Visualize clustering. | |
| 4 % | |
| 5 % h = som_clplot(sC, [[argID,] value, ...]) | |
| 6 % som_clplot(sM, part) | |
| 7 % | |
| 8 % som_clplot(sC); | |
| 9 % som_clplot(som_clstruct(Z)) | |
| 10 % som_clplot(sC,sM); | |
| 11 % som_clplot(sC,'coord',P); | |
| 12 % som_clplot(sC,'dendrogram',[1 1 1 1 0 0 1 1 0 0 1]); | |
| 13 % som_clplot(sC,'linewidth',10); | |
| 14 % som_clplot(sC,'size',10); | |
| 15 % som_clplot(sM,part); | |
| 16 % | |
| 17 % Input and output arguments ([]'s are optional): | |
| 18 % sC (struct) clustering struct, as produced by SOM_CLSTRUCT | |
| 19 % [argID, (string) See below. Each pair is the fieldname and | |
| 20 % value] (varies) the value to be given to that field. | |
| 21 % sM (struct) map struct | |
| 22 % part (vector) length = munits, partitioning for the map | |
| 23 % | |
| 24 % h (vector) handles to the arcs between | |
| 25 % | |
| 26 % Here are the valid argument IDs and corresponding values. The values | |
| 27 % which are unambiguous (marked with '*') can be given without the | |
| 28 % preceeding argID. | |
| 29 % 'linecolor' (string) color of the arc lines, 'k' by default | |
| 30 % (vector) size 1 x 3 | |
| 31 % 'linewidth' (scalar) width of the arc lines | |
| 32 % 'size' (vector) length 2*clen-1, sizes for each of the | |
| 33 % cluster markers | |
| 34 % (scalar) this size is used for all cluster markers | |
| 35 % 'dendrogram'(vector) size 2*clen-1, indicates which clusters | |
| 36 % are shown in the dendrogram | |
| 37 % *(string) 'on' or 'off' ('on' by default) | |
| 38 % 'coord' (matrix) size dlen x odim, the coordinates | |
| 39 % for the data. If odim<=2, these are used as is. | |
| 40 % Otherwise a 2-dimensional PCA-projection is | |
| 41 % first made (see function PCAPROJ). These | |
| 42 % coordinates are applied also to the clusters. | |
| 43 % *(struct) data struct: as above | |
| 44 % map or topology struct: the coordinates given | |
| 45 % by SOM_VIS_COORDS are used for the data | |
| 46 % 'color' (matrix) size dlen x 3, color for each data. By | |
| 47 % default the colors defined for base | |
| 48 % clusters are used (sC.color(sC.base,:)). | |
| 49 % For ignored data figure background color is used. | |
| 50 % (vector) size dlen x 1, indexed colors are used | |
| 51 % | |
| 52 % See also SOM_CLSTRUCT, SOM_LINKAGE, SOM_CLPRUNE, LINKAGE, DENDROGRAM. | |
| 53 | |
| 54 % Copyright (c) 2000 by Juha Vesanto | |
| 55 % Contributed to SOM Toolbox on XXX by Juha Vesanto | |
| 56 % http://www.cis.hut.fi/projects/somtoolbox/ | |
| 57 | |
| 58 % Version 2.0beta juuso 180600 | |
| 59 | |
| 60 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| 61 %% read the arguments | |
| 62 | |
| 63 % sC | |
| 64 if strcmp(sC.type,'som_map'), | |
| 65 base = varargin{1}; | |
| 66 clen = length(unique(base(isfinite(base)))); | |
| 67 Z = ones(clen-1,3); | |
| 68 Z(:,1) = randperm(clen-1)'; | |
| 69 Z(:,2) = [clen:2*clen-2]'; | |
| 70 Z(:,3) = [1:clen-1]'; | |
| 71 sT = sC; | |
| 72 sC = som_clstruct(Z,'base',varargin{1}); | |
| 73 h = som_clplot(sC,'coord',sT,'dendrogram','off',varargin{2:end}); | |
| 74 return; | |
| 75 end | |
| 76 clen = size(sC.tree,1)+1; | |
| 77 | |
| 78 % varargin | |
| 79 show = 'on'; | |
| 80 markersize = 10; | |
| 81 linecolor = 'k'; | |
| 82 linewidth = 1; | |
| 83 datacoord = []; | |
| 84 datacolor = []; | |
| 85 | |
| 86 i=1; | |
| 87 while i<=length(varargin), | |
| 88 argok = 1; | |
| 89 if ischar(varargin{i}), | |
| 90 switch varargin{i}, | |
| 91 case 'dendrogram', i=i+1; show = varargin{i}; | |
| 92 case 'size', i=i+1; markersize = varargin{i}; | |
| 93 case 'linecolor', i=i+1; linecolor = varargin{i}; | |
| 94 case 'linewidth', i=i+1; linewidth = varargin{i}; | |
| 95 case 'color', i=i+1; datacolor = varargin{i}; | |
| 96 case 'coord', i=i+1; datacoord = varargin{i}; | |
| 97 case {'on','off'}, show = varargin{i}; | |
| 98 otherwise argok=0; | |
| 99 end | |
| 100 elseif isstruct(varargin{i}), datacoord = varargin{i}; | |
| 101 else argok = 0; | |
| 102 end | |
| 103 if ~argok, disp(['(som_clplot) Ignoring invalid argument #' num2str(i+1)]); end | |
| 104 i=i+1; | |
| 105 end | |
| 106 | |
| 107 % markersize | |
| 108 if length(markersize)==1, markersize = ones(2*clen-1,1)*markersize; end | |
| 109 | |
| 110 % datacoord | |
| 111 if ~isempty(datacoord), | |
| 112 if isstruct(datacoord), | |
| 113 switch datacoord.type, | |
| 114 case 'som_map', datacoord = datacoord.topol; | |
| 115 case 'som_topol', %nil | |
| 116 case 'som_data', datacoord = datacoord.data; | |
| 117 otherwise, datacoord = []; | |
| 118 end | |
| 119 end | |
| 120 if isstruct(datacoord), | |
| 121 sC = som_clstruct(sC,'coord',som_vis_coords(datacoord.lattice,datacoord.msize)); | |
| 122 else | |
| 123 [dlen dim] = size(datacoord); | |
| 124 if dim>2, datacoord = pcaproj(datacoord,2); end | |
| 125 sC = som_clstruct(sC,'coord',datacoord); | |
| 126 end | |
| 127 end | |
| 128 | |
| 129 % show | |
| 130 if ischar(show), show = strcmp(show,'on'); end | |
| 131 if prod(size(show)) == 1, show = ones(2*clen-1,1)*show; end | |
| 132 | |
| 133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| 134 %% initialize values | |
| 135 | |
| 136 % find the children to show for each cluster | |
| 137 sTree0 = struct('parent',0,'children',[]); | |
| 138 sTree = sTree0; | |
| 139 for i=2:(2*clen-1), sTree(i) = sTree0; end | |
| 140 for i=(clen+1):(2*clen-1), | |
| 141 if isfinite(sC.tree(i-clen,3)), | |
| 142 ch = sC.tree(i-clen,1:2); | |
| 143 sTree(i).children = ch; | |
| 144 for j=1:length(ch), sTree(ch(j)).parent = i; end | |
| 145 end | |
| 146 end | |
| 147 if any(show==0), % some clusters are not shown | |
| 148 for i=(clen+1):(2*clen-1), | |
| 149 if ~show(i), | |
| 150 p = sTree(i).parent; | |
| 151 ch = sTree(i).children; | |
| 152 if p, | |
| 153 j = find(sTree(p).children == i); | |
| 154 sTree(p).children = [sTree(p).children([1:(j-1),(j+1):end]), ch]; | |
| 155 for j=1:length(ch), sTree(ch(j)).parent = p; end | |
| 156 end | |
| 157 end | |
| 158 end | |
| 159 end | |
| 160 | |
| 161 % the arcs | |
| 162 lfrom = []; lto = []; ladd = []; | |
| 163 for i=(clen+1):(2*clen-1), | |
| 164 if show(i), | |
| 165 ch = sTree(i).children'; | |
| 166 %ch = ch(find(show(ch)==1)); | |
| 167 lfrom = [lfrom; i*ones(length(ch),1)]; | |
| 168 lto = [lto; ch]; | |
| 169 end | |
| 170 end | |
| 171 | |
| 172 % infinite height | |
| 173 %isinf = ~isfinite(sC.height); | |
| 174 %sC.height(isinf) = 2*max(sC.height(~isinf)); | |
| 175 | |
| 176 % the coordinates of the arcs | |
| 177 Co = [sC.coord, sC.height]; | |
| 178 if size(Co,2)==2, | |
| 179 Lx = [Co(lfrom,1), Co(lto,1), Co(lto,1)]; | |
| 180 Ly = [Co(lfrom,end), Co(lfrom,end), Co(lto,end)]; | |
| 181 Lz = []; | |
| 182 else | |
| 183 Lx = [Co(lfrom,1), Co(lto,1), Co(lto,1)]; | |
| 184 Ly = [Co(lfrom,2), Co(lto,2), Co(lto,2)]; | |
| 185 Lz = [Co(lfrom,end), Co(lfrom,end), Co(lto,end)]; | |
| 186 end | |
| 187 | |
| 188 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| 189 %% plot | |
| 190 | |
| 191 washold = ishold; | |
| 192 if ~washold, cla; hold on; end | |
| 193 | |
| 194 % plot data | |
| 195 if ~isempty(datacoord), | |
| 196 if isempty(datacolor), | |
| 197 nancolor = get(gcf,'Color'); | |
| 198 Col = nancolor(ones(length(sC.base),1),:); | |
| 199 ind = find(isfinite(sC.base)); | |
| 200 Col(ind,:) = sC.color(sC.base(ind),:); | |
| 201 elseif size(datacolor,2)==1, Col = som_normcolor(datacolor,jet); | |
| 202 else Col = datacolor; | |
| 203 end | |
| 204 if isstruct(datacoord), som_cplane(datacoord,Col); | |
| 205 else som_grid('rect',[length(sC.base) 1],'line','none',... | |
| 206 'Coord',datacoord,'Markercolor',Col); | |
| 207 end | |
| 208 end | |
| 209 | |
| 210 h = []; | |
| 211 if any(show), | |
| 212 | |
| 213 % plot the lines | |
| 214 if isempty(Lz), | |
| 215 h = line(Lx',Ly','color',linecolor,'linewidth',linewidth); | |
| 216 else | |
| 217 h = line(Lx',Ly',Lz','color',linecolor,'linewidth',linewidth); | |
| 218 if ~washold, view(3); end | |
| 219 rotate3d on | |
| 220 end | |
| 221 | |
| 222 % plot the nodes | |
| 223 inds = find(show); | |
| 224 som_grid('rect',[length(inds) 1],'line','none',... | |
| 225 'Coord',Co(inds,:),... | |
| 226 'Markercolor',sC.color(inds,:),... | |
| 227 'Markersize',markersize(inds)); | |
| 228 end | |
| 229 | |
| 230 if ~washold, hold off, end | |
| 231 | |
| 232 return; | |
| 233 | |
| 234 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| 235 | |
| 236 | |
| 237 | |
| 238 | 
