diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_trajectory.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_trajectory.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,285 @@
+function som_trajectory(bmus,varargin)
+
+%SOM_TRAJECTORY Launch a "comet" trajectory visualization GUI.
+%
+%  som_show(sM,'umat','all')
+%  bmus = som_bmus(sM,sD);
+%  som_trajectory(bmus)
+%  som_trajectory(bmus, 'data1', sD, 'trajsize', [12 6 3 1]')
+%  som_trajectory(bmus, 'data1', sD.data(:,[1 2 3]), 'name1', {'fii' 'faa' 'foo'})
+%
+% Input arguments ([]'s are optional):
+%   bmus      (matrix) size Nx1, vector of BMUS
+%   ['argID', (string) Other arguments can be given as 'argID', value   
+%    value]   (varies) pairs. See list below for valid values.
+%
+% NOTE: the GUI only works on a figure which has been made with SOM_SHOW.
+%
+% Here are the valid argument IDs (case insensitive) and associated values: 
+%  'color'      string 'xor' or ColorSpec, default: 'xor'. 
+%               (default: according to lattice as in som_cplane)
+%  'TrajSize'   vector of size Nx1 to define the length of comet
+%               (N) and size of the comet dots in points. 
+%               default: [16 12 10 8 6 4]' 
+%  'Data1'      SOM Toolbox data struct or matrix. The size of
+%               data matrix (in data struct the field .data) is
+%               Nxd, where N must be the same as the amount of
+%               BMUS given in the first input argument 'bmus'
+%               This data is shown in a new window in d subplots.
+%               Default: BMU indices (first input argument)
+%  'Name1'      cell array of d strings which contains names
+%               for the components in 'Data1'. If 'Data1' is a SOM
+%               Toolbox data struct, the existing component names 
+%               are overdone.                 
+%  'Figure'     scalar that must be a handle to an existing figure
+%               which has been made using SOM_SHOW function.
+%               Default: current active figure (gcf).
+%
+% The following tools can be found in the 'Tools' -menu.
+%
+%  Remove Trajectory: removes trajectory from the map.
+%  Dye Nodes        : opens GUI for selecting color for the nodes
+%                     and points selected.
+%  Clear Markers    : removes markers from map and data figure.
+%  Save             : saves the current situation as a struct.
+%  Load             : loads the struct from workspace and draws markers.
+%
+% Mouse operation
+%
+%  In data window: Left button is used to drag the operation point ruler  
+%                  if left button is on blank area, it starts 
+%  In map window : Left button starts a polygon; right button
+%                  finishes; middle button toggles a unit.
+%
+% SOM_TRAJECTORY is an application for observing trajectory behavior.
+%
+% Using mouse the line in data figure can be dragged and the
+% trajectory moves in the SOM SHOW figure. It is also possible to move
+% trajectory by pressing keys '>' and '<' when mouse pointer is above
+% data figure.
+% 
+% Regions can be chosen from the data and the points in that region
+% are mapped to the component planes. Regions can be chosen also in
+% the map.  In this situation data points and map nodes are also
+% marked (Left mouse button adds point to the polygon indicating the
+% region and right button finals the polygon). By clicking a node (the
+% middle button) that node is either added or removed from selection.
+% 
+% It should be noticed that choosing intervals from data may cause
+% situations that seem to be bugs. If there exisist marks of different
+% color, removing them by clicking the map may left some marks in the
+% data, because more than one point in the data is mapped to the same
+% node in the map and the removing operation depends on the color of
+% the marks. However, all the marks can be removed by using the 'Clear
+% Markers' -operation.
+%
+% FEATURES
+%
+% The first input argument 'bmus' may also be a munits x N matrix
+% In this case each column defines a "fuzzy response". That is,
+% each column defines a hit histogram function). The element
+% bmus(i,t) sets the size of marker on unit i at time t. 
+% NOTE: - in this case no regions can be selcted on the map!
+%       - only > and < keys can be used to move the operation point
+%         line: it can't be dragged
+%       - "fuzzy response is always black (hope this will be fixed) 
+%       
+% It is possible to open a second data window showing different data:
+% use indetifiers 'Data2' (and 'Name2'). The argument syntax is
+% identical to 'Data1' (and 'Name1').
+%
+% See also SOM_SHOW, SOM_SHOW_ADD, SOM_BMUS. 
+
+% Contributed to SOM Toolbox 2.0, February 11th, 2000 by Johan
+% Himberg and Juha Parhankangas
+% Copyright (c) 2000 by the Johan Himberg and Juha Parhankangas
+% http://www.cis.hut.fi/projects/somtoolbox/        
+
+% Check arguments
+
+error(nargchk(1,Inf,nargin)); % Check no. of input arguments
+
+%% Init input argument struct (see subfunction)
+Traj=iniTraj(bmus);
+
+% Check tentative BMU input validity
+
+if ~vis_valuetype(bmus,{'nxm'}),
+  error(['First input should be a vector of BMU indices or' ...
+	 ' a "response matrix"']);
+end
+
+%% Check optional arguments
+for i=1:2:length(varargin)
+  identifier=lower(varargin{i});
+  value=varargin{i+1};
+
+  % Trajectory color
+  switch identifier  
+   case 'color'
+    if isempty(value)
+      value='xor';
+    end
+    if vis_valuetype(value,{'colorstyle','xor'})
+      Traj.color=value;
+    else
+      error('''Color'' has to be ColorSpec or string ''xor''.');
+    end
+   
+   % 1st data  
+   case 'data1'
+    if isempty(value),
+      value=[];
+    elseif vis_valuetype(value,{'nxm'})
+      Traj.primary_data=value;
+    elseif isstruct(value) & isfield(value,'type') & ...
+	  ischar(value.type) & strcmp(value.type,'som_data'),
+      Traj.primary_data=value.data;
+      if isempty(Traj.primary_names),
+	Traj.primary_names=value.comp_names;
+      end
+    end
+   
+    % 2nd data
+   case 'data2'
+    if isempty(value),
+      value=[];
+    elseif vis_valuetype(value,{'nxm'})
+      Traj.secondary_data=value;
+    elseif isstruct(value) & isfield(value,'type') & ...
+	  ischar(value.type) & strcmp(value.type,'som_data'),
+      Traj.secondary_data=value.data;
+      if isempty(Traj.secondary_names),
+	Traj.secondary_names=value.comp_names;
+      end
+     end
+   
+   % Trajectory length & size
+   case 'trajsize'
+    if isempty(value),
+      Traj.size=[16 12 10 8 6 4]';
+    end
+    if vis_valuetype(value,{'nx1'})
+      Traj.size=value
+    else
+      error('''TrajSize'' has to be a nx1 vector.');
+    end
+   
+   % Names for first data variables
+   case 'name1'
+    if isempty(value),
+      Traj.primary_names=[];
+    elseif ~vis_valuetype(value,{'cellcolumn_of_char'}),
+      error('''Name1'': variable names must be in a cell column array.') 
+    else
+      Traj.primary_names = value;
+    end
+   % Names for 2nd data variables
+   case 'name2'
+    if isempty(value),
+      Traj.secondary_names=[];
+    elseif ~vis_valuetype(value,{'cellcolumn_of_char'}),
+      error('''Name2'': variable names must be in a cell column array.') 
+    else
+      Traj.secondary_names = value;
+    end
+   
+   % Figure number
+   case 'figure'
+    if isempty(value)
+      Traj.figure='gcf';
+    end
+    if vis_valuetype(value,{'1x1'})
+      Traj.figure=value;
+    else
+      error('''Figure'' should be number of an existing figure.')
+    end
+  end
+end
+
+%% Get SOM data from figure
+[h,msg,lattice,msize,dim]=vis_som_show_data('all',Traj.figure);
+
+%% Not a SOM_SHOW figure?
+if ~isempty(msg);
+  error('Figure is invalid: use SOM_SHOW to draw the figure.');
+end
+
+% Get map size from figure data
+Traj.lattice=lattice; 
+Traj.msize=msize;  
+if length(msize)>2,
+  error(['This function works only with 2D maps: figure contains' ...
+	 ' something else.']);
+end
+munits=prod(msize);
+
+% Check BMU (or response) and map match 
+
+if vis_valuetype(bmus,{'nx1'});
+  if max(bmus)>prod(msize) | min(bmus) <1
+    error('BMU indexes out of range.')
+  elseif any(round(bmus)~=bmus)
+    error('BMU indexes must be integer.');
+  elseif isempty(Traj.primary_data),
+    Traj.primary_data=bmus;
+  end
+elseif size(bmus,1) ~= munits 
+  error(['Response matrix column number must match with the number of' ...
+	 ' map units.']);
+else
+  bmus=bmus';
+  if isempty(Traj.primary_data),
+    Traj.primary_data=[1:size(bmus,1)]';
+    Traj.primary_names={'BMU Index'};
+  end
+end
+
+size1=size(Traj.primary_data);
+size2=size(Traj.secondary_data);
+
+% Data2 must not be defined alone
+
+if isempty(Traj.primary_data)&~isempty(Traj.secondary_data),
+  error('If ''Data2'' is specified ''Data1'' must be specified, too.');
+elseif ~isempty(Traj.secondary_data) ...
+      & size1~= size2
+  % If data1 and data2 exist both, check data1 and data2 match
+  error('''Data1'' and ''Data2'' have different amount of data vectors.')
+end
+
+% Check BMU and data1 match (data2 matches with 1 anyway)
+
+if ~isempty(Traj.primary_data) & size(bmus,1) ~= size1,
+  error(['The number of data vectors in ''data1'' must match with' ...
+	 ' the number of rows in the first input argument (bmus).']);
+end
+
+% Check that number of names and data dimension is consistent
+
+if ~isempty(Traj.primary_names) & (size1(2)~=length(Traj.primary_names)),
+  error('Number of component names and ''Data1'' dimension mismatch.');
+end
+if ~isempty(Traj.secondary_names) & ...
+      (size2(2)~=length(Traj.secondary_names)),
+  error('Number of component names and ''Data2'' dimension mismatch.');
+end
+
+%% Call the function that does the job
+vis_trajgui(Traj);
+
+%%% Subfunctions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function Traj=iniTraj(bmus)
+
+Traj.figure=gcf;
+Traj.primary_data=[];
+Traj.secondary_data=[];
+Traj.primary_names = [];  
+Traj.secondary_names = [];  
+Traj.size=[16 12 10 8 6 4]';
+Traj.bmus=bmus;
+Traj.color='xor';
+Traj.msize=[];
+Traj.lattice=[];
+