diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/somtoolbox/som_clplot.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,238 @@
+function h = som_clplot(sC,varargin)
+
+%SOM_CLPLOT Visualize clustering.
+% 
+% h = som_clplot(sC, [[argID,] value, ...])
+% som_clplot(sM, part)
+% 
+%   som_clplot(sC);
+%   som_clplot(som_clstruct(Z))
+%   som_clplot(sC,sM);
+%   som_clplot(sC,'coord',P);
+%   som_clplot(sC,'dendrogram',[1 1 1 1 0 0 1 1 0 0 1]);
+%   som_clplot(sC,'linewidth',10);
+%   som_clplot(sC,'size',10);
+%   som_clplot(sM,part);
+%    
+%  Input and output arguments ([]'s are optional):    
+%   sC        (struct) clustering struct, as produced by SOM_CLSTRUCT
+%   [argID,   (string) See below. Each pair is the fieldname and 
+%    value]   (varies) the value to be given to that field.
+%   sM        (struct) map struct
+%   part      (vector) length = munits, partitioning for the map
+%
+%   h         (vector) handles to the arcs between 
+%   
+% Here are the valid argument IDs and corresponding values. The values 
+% which are unambiguous (marked with '*') can be given without the
+% preceeding argID.
+%   'linecolor' (string) color of the arc lines, 'k' by default
+%               (vector) size 1 x 3
+%   'linewidth' (scalar) width of the arc lines
+%   'size'      (vector) length 2*clen-1, sizes for each of the 
+%                        cluster markers
+%               (scalar) this size is used for all cluster markers
+%   'dendrogram'(vector) size 2*clen-1, indicates which clusters 
+%                        are shown in the dendrogram
+%              *(string) 'on' or 'off' ('on' by default)
+%   'coord'     (matrix) size dlen x odim, the coordinates
+%                        for the data. If odim<=2, these are used as is.
+%                        Otherwise a 2-dimensional PCA-projection is
+%                        first made (see function PCAPROJ). These
+%                        coordinates are applied also to the clusters.
+%              *(struct) data struct: as above
+%                        map or topology struct: the coordinates given 
+%                        by SOM_VIS_COORDS are used for the data 
+%   'color'     (matrix) size dlen x 3, color for each data. By
+%                        default the colors defined for base 
+%                        clusters are used (sC.color(sC.base,:)).
+%                        For ignored data figure background color is used. 
+%               (vector) size dlen x 1, indexed colors are used
+%
+% See also SOM_CLSTRUCT, SOM_LINKAGE, SOM_CLPRUNE, LINKAGE, DENDROGRAM.
+
+% Copyright (c) 2000 by Juha Vesanto
+% Contributed to SOM Toolbox on XXX by Juha Vesanto
+% http://www.cis.hut.fi/projects/somtoolbox/
+ 
+% Version 2.0beta juuso 180600
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% read the arguments
+
+% sC
+if strcmp(sC.type,'som_map'), 
+  base = varargin{1}; 
+  clen = length(unique(base(isfinite(base)))); 
+  Z = ones(clen-1,3); 
+  Z(:,1) = randperm(clen-1)'; 
+  Z(:,2) = [clen:2*clen-2]'; 
+  Z(:,3) = [1:clen-1]'; 
+  sT = sC;
+  sC = som_clstruct(Z,'base',varargin{1}); 
+  h = som_clplot(sC,'coord',sT,'dendrogram','off',varargin{2:end}); 
+  return; 
+end
+clen = size(sC.tree,1)+1; 
+
+% varargin
+show = 'on'; 
+markersize = 10; 
+linecolor = 'k'; 
+linewidth = 1; 
+datacoord = []; 
+datacolor = []; 
+
+i=1; 
+while i<=length(varargin), 
+  argok = 1; 
+  if ischar(varargin{i}), 
+    switch varargin{i}, 
+     case 'dendrogram', i=i+1; show = varargin{i}; 
+     case 'size',       i=i+1; markersize = varargin{i}; 
+     case 'linecolor',  i=i+1; linecolor = varargin{i}; 
+     case 'linewidth',  i=i+1; linewidth = varargin{i};
+     case 'color',      i=i+1; datacolor = varargin{i};
+     case 'coord',      i=i+1; datacoord = varargin{i};
+     case {'on','off'}, show = varargin{i}; 
+     otherwise argok=0; 
+    end
+  elseif isstruct(varargin{i}), datacoord = varargin{i}; 
+  else argok = 0; 
+  end
+  if ~argok, disp(['(som_clplot) Ignoring invalid argument #' num2str(i+1)]); end
+  i=i+1;
+end
+
+% markersize
+if length(markersize)==1, markersize = ones(2*clen-1,1)*markersize; end
+
+% datacoord
+if ~isempty(datacoord),
+  if isstruct(datacoord), 
+    switch datacoord.type, 
+     case 'som_map',   datacoord = datacoord.topol;
+     case 'som_topol', %nil 
+     case 'som_data',  datacoord = datacoord.data;
+     otherwise,        datacoord = []; 
+    end  
+  end
+  if isstruct(datacoord), 
+    sC = som_clstruct(sC,'coord',som_vis_coords(datacoord.lattice,datacoord.msize));
+  else
+    [dlen dim] = size(datacoord);
+    if dim>2, datacoord = pcaproj(datacoord,2); end
+    sC = som_clstruct(sC,'coord',datacoord);
+  end
+end
+
+% show
+if ischar(show), show = strcmp(show,'on'); end
+if prod(size(show)) == 1, show = ones(2*clen-1,1)*show; end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% initialize values
+
+% find the children to show for each cluster
+sTree0 = struct('parent',0,'children',[]); 
+sTree = sTree0; 
+for i=2:(2*clen-1), sTree(i) = sTree0; end
+for i=(clen+1):(2*clen-1), 
+  if isfinite(sC.tree(i-clen,3)), 
+    ch = sC.tree(i-clen,1:2);
+    sTree(i).children = ch; 
+    for j=1:length(ch), sTree(ch(j)).parent = i; end
+  end  
+end
+if any(show==0), % some clusters are not shown
+  for i=(clen+1):(2*clen-1), 
+    if ~show(i),
+      p = sTree(i).parent;
+      ch = sTree(i).children;
+      if p, 
+	j = find(sTree(p).children == i);
+	sTree(p).children = [sTree(p).children([1:(j-1),(j+1):end]), ch]; 
+	for j=1:length(ch), sTree(ch(j)).parent = p; end
+      end
+    end    
+  end  
+end
+
+% the arcs
+lfrom = []; lto = []; ladd = [];
+for i=(clen+1):(2*clen-1),   
+  if show(i), 
+    ch = sTree(i).children'; 
+    %ch = ch(find(show(ch)==1)); 
+    lfrom = [lfrom; i*ones(length(ch),1)]; 
+    lto = [lto; ch];     
+  end
+end
+
+% infinite height
+%isinf = ~isfinite(sC.height); 
+%sC.height(isinf) = 2*max(sC.height(~isinf)); 
+
+% the coordinates of the arcs
+Co = [sC.coord, sC.height];
+if size(Co,2)==2, 
+  Lx = [Co(lfrom,1),   Co(lto,1),     Co(lto,1)];
+  Ly = [Co(lfrom,end), Co(lfrom,end), Co(lto,end)];
+  Lz = []; 
+else
+  Lx = [Co(lfrom,1),   Co(lto,1),     Co(lto,1)];
+  Ly = [Co(lfrom,2),   Co(lto,2),     Co(lto,2)];
+  Lz = [Co(lfrom,end), Co(lfrom,end), Co(lto,end)];
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% plot
+
+washold = ishold; 
+if ~washold, cla; hold on; end
+
+% plot data
+if ~isempty(datacoord), 
+  if isempty(datacolor),
+    nancolor = get(gcf,'Color'); 
+    Col = nancolor(ones(length(sC.base),1),:);
+    ind = find(isfinite(sC.base)); 
+    Col(ind,:) = sC.color(sC.base(ind),:); 
+  elseif size(datacolor,2)==1, Col = som_normcolor(datacolor,jet); 
+  else Col = datacolor;     
+  end    
+  if isstruct(datacoord), som_cplane(datacoord,Col);
+  else som_grid('rect',[length(sC.base) 1],'line','none',...
+		'Coord',datacoord,'Markercolor',Col); 
+  end
+end
+
+h = []; 
+if any(show), 
+
+  % plot the lines
+  if isempty(Lz), 
+    h = line(Lx',Ly','color',linecolor,'linewidth',linewidth); 
+  else 
+    h = line(Lx',Ly',Lz','color',linecolor,'linewidth',linewidth); 
+    if ~washold, view(3); end
+    rotate3d on
+  end
+  
+  % plot the nodes
+  inds = find(show); 
+  som_grid('rect',[length(inds) 1],'line','none',...
+	   'Coord',Co(inds,:),...
+	   'Markercolor',sC.color(inds,:),...
+	   'Markersize',markersize(inds));
+end
+
+if ~washold, hold off, end
+
+return;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+  
\ No newline at end of file