Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_cplane.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_cplane.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,470 @@ +function h=som_cplane(varargin) + +%SOM_CPLANE Visualize one 2D component plane, U-matrix or color plane. +% +% h=som_cplane(lattice, msize, color, [s], [pos]) +% h=som_cplane(topol, color, [s], [pos]) +% +% som_cplane('hexa', [10 5], 'none'); +% som_cplane('rect', [10 5], 'r'); +% som_cplane(sM.topol, sM.codebook(:,1)); +% U = som_umat(sM); som_cplane('hexaU',sM.topol.msize,U(:)); +% +% Input and output arguments ([]'s are optional): +% lattice (string) 'hexa', 'rect' (component planes) +% 'hexaU', 'rectU' (corresponding U-matrices) +% (matrix) defines the patch (see function VIS_PATCH). +% msize (vector) 1x2 vector defines grid size (M=prod(msize)) +% (matrix) Mx2 matrix gives explicit coordinates for each node +% topol (struct) map or topology struct +% color color for the nodes +% (matrix) Mx1 matrix gives indexed colors for the units +% Mx3 matrix of RGB triples gives explicit +% color for each unit +% (Note: in case of U-matrix, the number of color +% values is 4*prod(msize)-2*sum(msize)+1, not prod(msize)) +% (string) ColorSpec gives the same color for each node +% 'none' draws black edges only. +% [s] (matrix) size Mx1, gives individual size scaling for each node +% (scalar) gives the same size for each node, default=1. +% Additional features: see 'type som_cplane' +% This argument is ignored if the lattice is 'rectU' or 'hexaU'. +% [pos] (vector) a 1x2 vector that determines position of origin, +% default is [1 1]. +% +% h (scalar) the object handle for the PATCH object +% +% Axis are set to the 'ij' mode with equal spacing and turned off if +% 'pos' is not given. If 'lattice' is 'rect', 'hexa', 'rectU' or +% 'hexaU' the node (a,b) has coordinates (a,b) (+pos), except on the +% even numbered rows on the 'hexa' and 'hexaU' grids where the +% coordinates are (a,b+0.5) (+pos). +% +% For more help, try 'type som_cplane' or check out online documentation. +% See also SOM_PIEPLANE, SOM_PLOTPLANE, SOM_BARPLANE, VIS_PATCH, +% SOM_VIS_COORDS + +%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% som_cplane +% +% PURPOSE +% +% Visualizes a 2D component plane or u-matrix +% +% SYNTAX +% +% h = som_cplane(topol, color) +% h = som_cplane(lattice, msize, color) +% h = som_cplane(lattice, msize, color) +% h = som_cplane(..., size) +% h = som_cplane(..., size, pos) +% +% DESCRIPTION +% +% Creates some basic visualizations of the SOM grid: the component plane and +% the unified distance matrix. The routine draws the SOM grid as a patch +% object according to the specifications given in the input arguments and +% returns its object handle. +% +% Each unit of the map is presented by a polygon whose color, size, shape +% and location can be specified in various ways. The usual procedure +% is to choose the lattice and map size used in the map training. Then +% the function creates the standard sheet shaped topological +% representation of the map grid with hexagonal or rectangular units. +% When the values from a map codebook component (or from SOM_UMAT) +% are given to the function it produces an indexed coloring for the +% units (as in SURF command). Another possibility is to give a fixed +% RGB color for each unit explicitly. +% +% Special effects (variable unit size, location or shape) can be produced +% giving different types of input variables. +% +% KNOWN BUGS +% +% Using 1x3 or 3x1 grids causes problem, as the MATLAB will treat the color +% information vector 1x3 or 3x1 as a single RGB triple. So, using indexed +% colors is not possible for this particular map size. +% +% It is not possible to specify explicit coordinates for map +% consistig of just one unit as then the msize is interpreted as +% map size. +% +% REQUIRED INPUT ARGUMENTS +% +% Note: M is the number of map units +% +% lattice The basic shape of the map units +% +% (string) 'hexa' or 'rect' creates standard component plane; +% 'hexaU' or 'rectU' creates standard u-matrix. +% (matrix) Lx2 matrix defines the cornes of an arbitary polygon to be used +% as the unit marker. (L is the number of patch vertex: L=6 for +% 'hexa' and L=4 for 'rect') +% +% msize The size of the map grid +% +% (vector) [n1 n2] vector defines the map size (height n1 units, width +% n2 units, total M=n1 x n2 units). The units will be placed to their +% topological locations to form a uniform hexagonal or rectangular grid. +% (matrix) Mx2 matrix defines arbitrary coordinates for the M units +% In this case the argument 'lattice' defines the unit form only. +% +% topol Topology of the map grid +% +% (struct) map or topology struct from which the topology is taken +% +% color Unit colors +% +% (string) (ColorSpec) gives the same color for each unit, 'none' +% draws black unit edges only. +% (vector) Mx1 column vector gives indexed color for each unit using the +% current colormap (see help colormap). +% (matrix) Mx3 matrix of RGB triples as rows gives each unit a fixed color. +% +% OPTIONAL INPUT ARGUMENTS +% +% Note: M is the number of map units. +% Note: if unspecified or given empty values ('' or []) default +% values are used for optional input arguments. +% +% s The size scaling factors for the units +% +% (scalar) scalar gives each unit the same size scaling: +% 0 unit disappears (edges can be seen as a dot). +% 1 by default unit has its normal size (ie. no scaling) +% >1 unit overlaps others +% (matrix) Mx1 double: each unit gets individual size scaling +% +% pos Position of origin +% +% (vector) This argument exists to be able drawing component planes +% in arbitrary locations in a figure. Note the operation: +% if this argument is given, the axis limits setting +% part in the routine is skipped and the limits setting +% will be left to be done by MATLAB's default +% operation. +% +% OUTPUT ARGUMENTS +% +% h (scalar) handle to the created patch object +% +% OBJECT TAGS +% +% One object handle is returned: field Tag is set to +% 'planeC' for component plane +% 'planeU' for U-matrix +% +% FEATURES +% +% There are some extra features in following arguments +% +% size +% - MxL matrix: radial scaling: the distance between +% the center of node m and its kth vertex is scaled by +% s(m,k). +% - Mx1x2 matrix: the uniform scaling is done separately for +% x- and y-directions +% - MxLx2 matrix: the scaling is done separately to x- and y- +% directions for each vertex. +% +% color +% Each vertex may be given individual color. +% The PATCH object interpolates the colors on the +% face if shading is turned to interp. +% - 1xMxL matrix: colormap index for each vertex +% - LxMx3 matrix: RGB color for each vertex +% +% Note: In both cases (size and color) the ordering of the patch +% vertices in the "built-in" patches is the following +% +% 'rect' 'hexa' +% 1 3 1 +% 2 4 5 2 +% 6 3 +% 4 +% +% The color interpolation result seem to depend on the order +% in which the patch vertices are defined. Anyway, it gives +% unfavourable results in our case especially with hexa grid: +% this is a MATLAB feature. +% +% EXAMPLES +% +% m=som_make(rand(100,4),'msize',[6 5]) % make a map +% +% % show the first variable plane using indexed color coding +% +% som_cplane(m.topol.lattice,m.topol.msize,m.codebook(:,1)); +% or som_cplane(m.topol,m.codebook(:,1)); +% or som_cplane(m,m.codebook(:,1)); +% +% % show the first variable using different sized black units +% +% som_cplane(m,'k',m.codebook(:,1)); +% +% % Show the u-matrix. First we have to calculate it. +% % Note: som_umat returns a matrix therefore we write u(:) to get +% % a vector which contains the values in the proper order. +% +% u=som_umat(m); +% som_cplane('hexaU', m.topol.msize, u(:)); +% +% % Show three first variables coded as RGB colors +% % and turn the unit edges off +% +% h=som_cplane(m, m.codebook(:,1:3),1) +% set(h,'edgecolor','none'); +% +% % Try this! (see section FEATURES) +% +% som_cplane('rect',[5 5],'none',rand(25,4)); +% som_cplane('rect',[5 5],rand(1,25,4)); +% +% SEE ALSO +% +% som_barplane Visualize the map prototype vectors as bar diagrams +% som_plotplane Visualize the map prototype vectors as line graphs +% som_pieplane Visualize the map prototype vectors as pie charts +% som_umat Compute unified distance matrix of self-organizing map +% vis_patch Define the basic patches used in som_cplane +% som_vis_coords The default 'hexa' and 'rect' coordinates in visualizations + +% Copyright (c) 1999-2000 by the SOM toolbox programming team. +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Version 2.0beta Johan 061099 juuso 151199 juuso 070600 + +%%% Check & Init arguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +[nargin, lattice, msize, color, s, pos]=vis_planeGetArgs(varargin{:}); +error(nargchk(3, 5, nargin)); % check no. of input args is correct + +%% Translation? + +if nargin < 5 | isempty(pos) + pos=NaN; % "no translation" flag +elseif ~vis_valuetype(pos,{'1x2'}), + error('Position of origin has to be given as an 1x2 vector.'); +end + +%% Patchform %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +switch class(lattice) +case 'char' % built-in patchforms + pos=pos-1; + switch lattice + case {'hexa', 'hexaU'} + patchform=vis_patch('hexa'); + case {'rect', 'rectU'} + patchform=vis_patch('rect'); + otherwise + error([ 'Lattice ' lattice ' not implemented!']); + end +case { 'double', 'sparse'} + if vis_valuetype(lattice,{'nx2'}), + patchform=lattice; % users patchform + lattice='rect'; + else + error('Patchform matrix has wrong size'); + end +otherwise + error('String or matrix expected for lattice.'); +end + +l=size(patchform,1); % number of vertices +planeType=lattice(end); % 'U' if umatrix otherwise something else + +if ~vis_valuetype(msize,{ '1x2', 'nx2'}), + error('msize has to be given as 1x2 or nx2 vectors.'); +end + +%% msize or coordinates %%%%%%%%%%%%%%%%%%%%%%% + +if size(msize,1)>1 + % msize is coordinate matrix Nx2? + + if planeType == 'U', % don't accept u-matrix + error('U-matrix visualization doesn''t work with free coordinates.'); + end + + % set number of map unit and unit coordinates + munits=size(msize,1); + unit_coords=msize; msize=[munits 1]; + + if isnan(pos), % no translation is done here + pos=[0 0]; % using [0 0] in order to prevent + end % axis tightening in + % vis_PlaneAxisProperties (arbitary coords!) +else + % msize is built-in lattice + + unit_coords=som_vis_coords(lattice,msize); + + % Calculate matrices x and y which 'moves' nodes + % to the correct positions: + % For U-matrix, the size has to be recalculated + if planeType == 'U', + xdim=2*msize(1)-1;ydim=2*msize(2)-1; + else + xdim=msize(1);ydim=msize(2); + end + munits=xdim*ydim; + + % Feature warning + if munits == 3 + warning('Problems with 1x3 and 3x1 maps. See documentation.'); + end +end + +%% Color matrix %%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if ~isnumeric(color) & ~ischar(color), + error('Color matrix is invalid.'); +else + d=size(color); + switch length(d) + case 2 %% Flat colors + if ischar(color) % Check for string 'none' + if strcmp(color,'none'), + color=NaN; + end + else + if ~(d(1)== 1 & d(2) == 3) & ... + ~(d(1) == munits & (d(2)==1 | d(2)==3)) + error('Color data matrix has wrong size.'); + elseif d(1)~=1 & d(2)==3 + if any(color>1 | color<0) + error('Color data matrix has invalid RGB values.'); + end + color=reshape(color,[1 munits 3]); % RGB colors + elseif d(2)==1 + color=color'; % indexed + end + end + case 3 %% Interpolated colors + if d(1) == 1 & d(2) == munits & d(3) == l, + color=reshape(color, l, munits); + elseif ~(d(1) == l & d(2) == munits & d(3) == 3) + error('Color data matrix has wrong size.'); + end + otherwise + error('Color data matrix has too many dimensions.'); + end +end + +%% Size matrix? %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if nargin < 4 | isempty(s), + s=1; % default value for s (no scaling) +elseif ~isnumeric(s) + error('Size matrix is not numeric.'); +end + +%%Determine the type of size matrix +d=size(s); +switch length(d) +case 2 + if (d(1)==1 & d(2)==1), + % Each node gets the same, uniform scaling. + s=s'; sx=s; sy=s; + elseif (d(1)==munits & d(2)==l), + % Each vertex is scaled radially respetc to the + % node center. + s=s'; sx=s; sy=s; + elseif d(1)==munits & d(2)==1 + % Each node gets an individual uniform scaling. + sx=repmat(s',l,1); sy=sx; + else + error('Size matrix has wrong size.'); + end +case 3 + if d(1)==munits & d(2)==1 & d(3)==2, + % Each node is individually and uniformly + % scaled separately to x- and y-directions. + sx=repmat(shiftdim(s(:,:,1))',l,1); + sy=repmat(shiftdim(s(:,:,2))',l,1); + elseif d(1)==munits & d(2)==l & d(3)==2, + % Each vertex is scaled separately to x- and y-directions + % with respect to the node center. + sx=shiftdim(s(:,:,1))'; + sy=shiftdim(s(:,:,2))'; + else + error('Size matrix has wrong size.'); + end +otherwise + error('Size matrix has too many dimensions.'); +end + +% Size zero would cause division by zero. eps is as good (node disappears) +% I tried first NaN, it works well otherwise, but the node is +% then not on the axis and some commands may the work oddly. +% The edge may be visible, though. + +sx(sx==0)=eps; +sy(sy==0)=eps; + +% Rescale sizes for u-matrix +if planeType=='U', + sx=sx/2;sy=sy/2; +end + +%%%% Action %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Making grid. %%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Translation for each patch + +x=repmat(unit_coords(:,1)',l,1); +y=repmat(unit_coords(:,2)',l,1); + +% patch vertex coordiantes + +nx=repmat(patchform(:,1),1,munits); +ny=repmat(patchform(:,2),1,munits); + +% NB: The hexagons are not uniform in order to get even +% y-coordinates for the nodes. This is handled by setting _axis scaling_ +% so that the hexa-nodes look like uniform hexagonals. See +% vis_PlaneAxisProperties + +%% Make and scale the final input for PATCH: + +% 1: combine translation and scaling of each patch +x=(x./sx+nx).*sx; y=(y./sy+ny).*sy; + +%% 2: translation of origin (pos) +if ~isnan(pos) + x=x+pos(1);y=y+pos(2); % move upper left corner +end % to pos + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Set axes properties +%% Command view([0 90]) shows the map in 2D properly oriented + +ax=newplot; % set new plot +vis_PlaneAxisProperties(ax,lattice,msize,pos); + +%% Draw the map! + +if ~isnan(color) + h_=patch(x,y,color); +else + h_=patch(x,y,'k'); % empty grid + set(h_,'FaceColor','none'); +end + +%% Set object tag + +if planeType=='U' + set(h_,'Tag','planeU'); +else + set(h_,'Tag','planeC'); +end + +%%% Build output %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if nargout>0, h=h_; end % Set h only, + % if there really is output +