diff scripts/plot/__scatter__.m @ 7189:e8d953d03f6a

[project @ 2007-11-26 20:42:09 by dbateman]
author dbateman
date Mon, 26 Nov 2007 20:42:11 +0000
parents
children b48a21816f2e
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/scripts/plot/__scatter__.m
@@ -0,0 +1,124 @@
+## Copyright (C) 2007 David Bateman
+##
+## This file is part of Octave.
+##
+## Octave is free software; you can redistribute it and/or modify it
+## under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or (at
+## your option) any later version.
+##
+## Octave is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with Octave; see the file COPYING.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+## Undocumented internal function.
+
+function h = __scatter__ (varargin)
+  h = varargin {1};
+  nd = varargin {2};
+  fcn = varargin {3};
+  x = varargin {4}(:);
+  y = varargin {5}(:);
+  istart = 6;
+  if (nd == 3)
+    z = varargin {6}(:);
+    istart = 7;
+  else
+    z = zeros (length(x), 0);
+  endif
+
+  firstnonnumeric = Inf;
+  for i = istart:nargin
+    if (! isnumeric (varargin {i}))
+      firstnonnumeric = i;
+      break;
+    endif
+  endfor
+
+  if (firstnonnumeric > istart)
+    s = varargin {istart};
+    if (isempty (s))
+      s = 8;
+    endif
+  else
+    s = 8;
+  endif
+  ## Note markersize is in points^2 for 2D and points for 3D, and 
+  ## the below is an approximation, that is empircally visually correct.
+  if (nd == 2)
+    s = sqrt (s) / 2;
+  else
+    s = s / 4;
+  endif
+
+  if (istart < nargin && firstnonnumeric > istart + 1)
+    c = varargin {istart + 1};
+    if (isvector (c))
+      c = c(:);
+    endif
+  elseif (firstnonnumeric == istart + 1 && ischar (varargin {istart + 1}))
+    c = varargin{istart + 1};
+    firstnonnumeric++;
+  else
+    c = 1 : length(x);
+  endif
+
+  newargs = {};
+  filled = false;
+  have_marker = false;
+  marker = "o";
+  iarg = firstnonnumeric;
+  while (iarg <= nargin)
+    arg = varargin {iarg++};
+    if (ischar (arg) && strncmp (tolower (arg), "filled", 6))
+      filled = true;
+    elseif ((isstr (arg) || iscell (arg)) && ! have_marker)
+      [linespec, valid] = __pltopt__ ("scatter", arg, false);
+      if (valid)
+	have_marker = true;
+	marker = linespec.marker;
+	if (strncmp (marker, "none", 4))
+	  marker = "o";
+	endif
+      else
+	error ("scatter: invalid linespec");
+      endif
+    else
+      newargs{end+1} = arg;
+      if (iarg <= nargin)
+	newargs{end+1} = varagin{iarg++};
+      endif
+    endif
+  endwhile
+
+  if (ischar (c))
+    h = patch('faces', [1:length(x)].', 'vertices', [x, y, z], 'facecolor',
+	      'none', 'edgecolor', c, 'marker', marker, 
+	      'markersize', s, 'linestyle', 'none');
+    if (filled)
+      set(h, 'markerfacecolor', c); 
+    endif
+  else
+    h = patch('faces', [1:length(x)].', 'vertices', [x, y, z], 'facecolor',
+	      'none', 'edgecolor', 'flat', 'cdata', c, 'marker', marker, 
+	      'markersize', s, 'linestyle', 'none');
+    if (filled)
+      set(h, 'markerfacecolor', 'flat'); 
+    endif
+    ax = get (h, "parent");
+    clim = get (ax, "clim");
+    if (min(c(:)) < clim(1))
+      clim(1) = min(c(:));
+      set (ax, "clim", clim);
+    endif
+    if (max(c(:)) > clim(2))
+      set (ax, "clim", [clim(1), max(c(:))]);
+    endif
+  endif
+
+endfunction