changeset 7207:71c03c7239fb

[project @ 2007-11-28 02:19:25 by jwe]
author jwe
date Wed, 28 Nov 2007 02:20:48 +0000
parents 6e4ceeeb1940
children a730e47fda4d
files scripts/ChangeLog scripts/plot/Makefile.in scripts/plot/errorbar.m scripts/plot/loglog.m scripts/plot/loglogerr.m scripts/plot/meshc.m scripts/plot/meshz.m scripts/plot/polar.m scripts/plot/semilogx.m scripts/plot/semilogxerr.m scripts/plot/semilogy.m scripts/plot/semilogyerr.m scripts/plot/surface.m
diffstat 13 files changed, 282 insertions(+), 111 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/ChangeLog	Wed Nov 28 02:20:48 2007 +0000
@@ -1,5 +1,17 @@
 2007-11-27  David Bateman  <dbateman@free.fr>
 
+	* plot/errorbar.m, plot/loglog.m, plot/loglogerr.m, plot/polar.m,
+	plot/semilogx.m, plot/semilogxerr.m, plot/semilogy.m,
+	plot/semilogyerr.m: Treat an axis handle as the first argument.
+
+	* plot/meshz.m: New function.
+	* plot/Makefile.in (SOURCES): Add it to the list.
+	* plot/surface.m: Allow surface to accept an axis handle as the
+	first argument.
+	* plot/meshc.m: Extract z from the the surface object rather than
+	varargin so that we can rely on code in surface to treat leading
+	axis handles.
+
 	* plot/__go_draw_axes__.m: Add nomirror to "set ytics" and "set
 	y2tics" in the case of a plotyy plot.
 	* plot/plotyy.m: ensure the position property is set correct for
--- a/scripts/plot/Makefile.in	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/Makefile.in	Wed Nov 28 02:20:48 2007 +0000
@@ -103,6 +103,7 @@
   mesh.m \
   meshc.m \
   meshgrid.m \
+  meshz.m \
   ndgrid.m \
   newplot.m \
   orient.m \
--- a/scripts/plot/errorbar.m	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/errorbar.m	Wed Nov 28 02:20:48 2007 +0000
@@ -110,11 +110,14 @@
 
 function errorbar (varargin)
 
-  newplot ();
-
-  ## [h, varargin] = __plt_get_axis_arg__ ("errorbar", varargin{:});
-  h = gca ();
-
-  __errcomm__ ("errorbar", h, varargin{:});
+  [h, varargin] = __plt_get_axis_arg__ ("errorbar", varargin{:});
+  oldh = gca ();
+  unwind_protect
+    axes (h);
+    newplot ();
+    __errcomm__ ("errorbar", h, varargin{:});
+  unwind_protect_cleanup
+    axes (oldh);
+  end_unwind_protect
 
 endfunction
--- a/scripts/plot/loglog.m	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/loglog.m	Wed Nov 28 02:20:48 2007 +0000
@@ -29,17 +29,22 @@
 
 function retval = loglog (varargin)
 
-  newplot ();
+  [h, varargin] = __plt_get_axis_arg__ ("loglog", varargin{:});
+  oldh = gca ();
+  unwind_protect
+    axes (h);
+    newplot ();
 
-  ## [h, varargin] = __plt_get_axis_arg__ ("loglog", varargin{:});
-  h = gca ();
+    set (h, "xscale", "log", "yscale", "log");
 
-  set (h, "xscale", "log", "yscale", "log");
-
-  tmp = __plt__ ("loglog", h, varargin{:});
+    tmp = __plt__ ("loglog", h, varargin{:});
 
-  if (nargout > 0)
-    retval = tmp;
-  endif
+    if (nargout > 0)
+      retval = tmp;
+    endif
+
+  unwind_protect_cleanup
+    axes (oldh);
+  end_unwind_protect
 
 endfunction
--- a/scripts/plot/loglogerr.m	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/loglogerr.m	Wed Nov 28 02:20:48 2007 +0000
@@ -40,17 +40,22 @@
 
 function retval = loglogerr (varargin)
 
-  newplot ();
+  [h, varargin] = __plt_get_axis_arg__ ("loglogerr", varargin{:});
+  oldh = gca ();
+  unwind_protect
+    axes (h);
+    newplot ();
 
-  ## [h, varargin] = __plt_get_axis_arg__ ("loglog", varargin{:});
-  h = gca ();
+    set (h, "xscale", "log", "yscale", "log");
 
-  set (h, "xscale", "log", "yscale", "log");
-
-  tmp = __errcomm__ ("loglogerr", h, varargin{:});
+    tmp = __errcomm__ ("loglogerr", h, varargin{:});
 
-  if (nargout > 0)
-    retval = tmp;
-  endif
+    if (nargout > 0)
+      retval = tmp;
+    endif
+
+  unwind_protect_cleanup
+    axes (oldh);
+  end_unwind_protect
 
 endfunction
--- a/scripts/plot/meshc.m	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/meshc.m	Wed Nov 28 02:20:48 2007 +0000
@@ -42,11 +42,7 @@
     set (ax, "view", [-37.5, 30]);
   endif
 
-  if (nargin == 1)
-    z = varargin {1};
-  else
-    z = varargin {3};
-  endif
+  z = get (tmp, "zdata");
   zmin = 2 * (min(z(:)) - max(z(:)));
 
   [c, tmp2] = __contour__ (ax, zmin, varargin{:});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/plot/meshz.m	Wed Nov 28 02:20:48 2007 +0000
@@ -0,0 +1,100 @@
+## 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/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} meshz (@var{x}, @var{y}, @var{z})
+## Plot a curtain mesh given matrices @var{x}, and @var{y} from 
+## @code{meshgrid} and a matrix @var{z} corresponding to the @var{x} and 
+## @var{y} coordinates of the mesh.  If @var{x} and @var{y} are vectors, 
+## then a typical vertex is (@var{x}(j), @var{y}(i), @var{z}(i,j)).  Thus, 
+## columns of @var{z} correspond to different @var{x} values and rows of 
+## @var{z} correspond to different @var{y} values.
+## @seealso{meshgrid, mesh, contour}
+## @end deftypefn
+ 
+function retval = meshz (varargin)
+
+  if (isscalar (varargin{1}) && ishandle (varargin{1}))
+    h = varargin {1};
+    if (! strcmp (get (h, "type"), "axes"))
+      error ("meshz: expecting first argument to be an axes object");
+    endif
+    oldh = gca ();
+    unwind_protect
+      axes (h);
+      tmp = __meshz__ (varargin{2:end});
+    unwind_protect_cleanup
+      axes (oldh);
+    end_unwind_protect
+  else
+    tmp = __meshz__ (varargin{:});
+  endif
+
+  if (nargout > 0)
+    retval = tmp;
+  endif
+
+endfunction
+
+function h = __meshz__ (varargin)
+
+  ioff = nargin + 1;
+  for i = 1 : nargin
+    if (ischar (varargin {i}))
+      ioff = i;
+      break;
+    endif
+  endfor
+
+  ## Bundle C matrix back into varargin
+  if (ioff == 3 || ioff == 5)
+    ioff --;
+  endif
+
+  if (ioff == 2)
+    z = varargin {1};
+    [m, n] = size (z);
+    x = 1 : n;
+    y = (1 : m).';
+  else
+    x = varargin {1};
+    y = varargin {2};
+    z = varargin {3};
+  endif
+
+
+  if (isvector (x) && isvector (y))
+    x = [x(1), x(:).', x(end)];
+    y = [y(1); y(:); y(end)];
+  else
+    x = [x(1, 1), x(1, :), x(1, end);
+	 x(:, 1), x, x(:, end);
+	 x(end, 1), x(end, :), x(end, end)]; 
+    y = [y(1, 1), y(1, :), y(1, end);
+	 y(:, 1), y, y(:, end);
+	 y(end, 1), y(end, :), y(end, end)]; 
+  endif
+
+  zref = min(z(isfinite(z)));
+  z = [zref .* ones(1, size(z, 2) + 2);
+       zref .* ones(size(z, 1), 1), z, zref .* ones(size(z, 1), 1); 
+       zref.* ones(1, size(z, 2) + 2)];
+
+  h = mesh (x, y, z, varargin{ioff:end});
+
+endfunction
--- a/scripts/plot/polar.m	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/polar.m	Wed Nov 28 02:20:48 2007 +0000
@@ -30,34 +30,39 @@
 
 function retval = polar (varargin)
 
-  newplot ();
+  [h, varargin] = __plt_get_axis_arg__ ("loglogerr", varargin{:});
+  oldh = gca ();
+  unwind_protect
+    axes (h);
+    newplot ();
 
-  ## [h, varargin] = __plt_get_axis_arg__ ("semilogx", varargin{:});
-  h = gca ();
+    nargs = numel (varargin);
 
-  nargs = numel (varargin);
-
-  if (nargs == 3)
-    if (! ischar (varargin{3}))
-      error ("polar: third argument must be a string");
+    if (nargs == 3)
+      if (! ischar (varargin{3}))
+	error ("polar: third argument must be a string");
+      endif
+      tmp = __plr2__ (h, varargin{:});
+    elseif (nargin == 2)
+      if (ischar (varargin{2}))
+	tmp = __plr1__ (h, varargin{:});
+      else
+	fmt = "";
+	tmp = __plr2__ (h, varargin{:}, fmt);
+      endif
+    elseif (nargin == 1)
+      fmt = "";
+      tmp = __plr1__ (h, varargin{:}, fmt);
+    else
+      print_usage ();
     endif
-    tmp = __plr2__ (h, varargin{:});
-  elseif (nargin == 2)
-    if (ischar (varargin{2}))
-      tmp = __plr1__ (h, varargin{:});
-    else
-      fmt = "";
-      tmp = __plr2__ (h, varargin{:}, fmt);
+
+    if (nargout > 0)
+      retval = tmp;
     endif
-  elseif (nargin == 1)
-    fmt = "";
-    tmp = __plr1__ (h, varargin{:}, fmt);
-  else
-    print_usage ();
-  endif
 
-  if (nargout > 0)
-    retval = tmp;
-  endif
+  unwind_protect_cleanup
+    axes (oldh);
+  end_unwind_protect
 
 endfunction
--- a/scripts/plot/semilogx.m	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/semilogx.m	Wed Nov 28 02:20:48 2007 +0000
@@ -29,17 +29,22 @@
 
 function retval = semilogx (varargin)
 
-  newplot ();
+  [h, varargin] = __plt_get_axis_arg__ ("semilogx", varargin{:});
+  oldh = gca ();
+  unwind_protect
+    axes (h);
+    newplot ();
 
-  ## [h, varargin] = __plt_get_axis_arg__ ("semilogx", varargin{:});
-  h = gca ();
+    set (h, "xscale", "log");
 
-  set (h, "xscale", "log");
-
-  tmp = __plt__ ("semilogx", h, varargin{:});
+    tmp = __plt__ ("semilogx", h, varargin{:});
 
-  if (nargout > 0)
-    retval = tmp;
-  endif
+    if (nargout > 0)
+      retval = tmp;
+    endif
+
+  unwind_protect_cleanup
+    axes (oldh);
+  end_unwind_protect
 
 endfunction
--- a/scripts/plot/semilogxerr.m	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/semilogxerr.m	Wed Nov 28 02:20:48 2007 +0000
@@ -40,17 +40,22 @@
 
 function retval = semilogxerr (varargin)
 
-  newplot ();
+  [h, varargin] = __plt_get_axis_arg__ ("semilogxerr", varargin{:});
+  oldh = gca ();
+  unwind_protect
+    axes (h);
+    newplot ();
 
-  ## [h, varargin] = __plt_get_axis_arg__ ("loglog", varargin{:});
-  h = gca ();
+    set (h, "xscale", "log");
 
-  set (h, "xscale", "log");
-
-  tmp = __errcomm__ ("semilogxerr", h, varargin{:});
+    tmp = __errcomm__ ("semilogxerr", h, varargin{:});
 
-  if (nargout > 0)
-    retval = tmp;
-  endif
+    if (nargout > 0)
+      retval = tmp;
+    endif
+
+  unwind_protect_cleanup
+    axes (oldh);
+  end_unwind_protect
 
 endfunction
--- a/scripts/plot/semilogy.m	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/semilogy.m	Wed Nov 28 02:20:48 2007 +0000
@@ -29,17 +29,22 @@
 
 function retval = semilogy (varargin)
 
-  newplot ();
+  [h, varargin] = __plt_get_axis_arg__ ("semilogy", varargin{:});
+  oldh = gca ();
+  unwind_protect
+    axes (h);
+    newplot ();
 
-  ## [h, varargin] = __plt_get_axis_arg__ ("semilogy", varargin{:});
-  h = gca ();
+    set (h, "yscale", "log");
 
-  set (h, "yscale", "log");
-
-  tmp = __plt__ ("semilogy", h, varargin{:});
+    tmp = __plt__ ("semilogy", h, varargin{:});
 
-  if (nargout > 0)
-    retval = tmp;
-  endif
+    if (nargout > 0)
+      retval = tmp;
+    endif
+
+  unwind_protect_cleanup
+    axes (oldh);
+  end_unwind_protect
 
 endfunction
--- a/scripts/plot/semilogyerr.m	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/semilogyerr.m	Wed Nov 28 02:20:48 2007 +0000
@@ -40,17 +40,22 @@
 
 function retval = semilogyerr (varargin)
 
-  newplot ();
+  [h, varargin] = __plt_get_axis_arg__ ("semilogyerr", varargin{:});
+  oldh = gca ();
+  unwind_protect
+    axes (h);
+    newplot ();
 
-  ## [h, varargin] = __plt_get_axis_arg__ ("loglog", varargin{:});
-  h = gca ();
+    set (h, "yscale", "log");
 
-  set (h, "yscale", "log");
-
-  tmp = __errcomm__ ("semilogyerr", h, varargin{:});
+    tmp = __errcomm__ ("semilogyerr", h, varargin{:});
 
-  if (nargout > 0)
-    retval = tmp;
-  endif
+    if (nargout > 0)
+      retval = tmp;
+    endif
+
+  unwind_protect_cleanup
+    axes (oldh);
+  end_unwind_protect
 
 endfunction
--- a/scripts/plot/surface.m	Tue Nov 27 22:40:20 2007 +0000
+++ b/scripts/plot/surface.m	Wed Nov 28 02:20:48 2007 +0000
@@ -41,19 +41,45 @@
 
 function h = surface (varargin)
 
-  ax = gca ();
+  if (isscalar (varargin{1}) && ishandle (varargin{1}))
+    h = varargin {1};
+    if (! strcmp (get (h, "type"), "axes"))
+      error ("surface: expecting first argument to be an axes object");
+    endif
+    oldh = gca ();
+    unwind_protect
+      axes (h);
+      [tmp, bad_usage] = __surface__ (h, varargin{2:end});
+    unwind_protect_cleanup
+      axes (oldh);
+    end_unwind_protect
+  else
+    [tmp, bad_usage] = __surface__ (gca (), varargin{:});
+  endif
 
-  firststring = nargin + 1;
-  for i = 1 : nargin
-    if (ischar (varargin {i}))
-      firststring = i;
+  if (bad_usage)
+    print_usage ();
+  endif
+
+  if (nargout > 0)
+    h = tmp;
+  endif
+endfunction
+
+function [h, bad_usage] = __surface__ (ax, varargin)
+
+  bad_usage = false;
+  h = 0;
+  firststring = nargin;
+  for i = 2 : nargin
+    if (ischar (varargin {i - 1}))
+      firststring = i - 1;
       break;
     endif
   endfor
 
-
   if (firststring > 5)
-    print_usage ();
+    bad_usage = true;
   elseif (firststring == 5)
     x = varargin{1};
     y = varargin{2};
@@ -117,23 +143,21 @@
       error ("surface: argument must be a matrix");
     endif
   else
-    print_usage ();
-  endif
-
-  ## Make a default surface object.
-  tmp = __go_surface__ (ax, "xdata", x, "ydata", y, "zdata", z, "cdata", c);
-  set (tmp, "facecolor","flat");
-  if (firststring <= nargin)
-    set (tmp, varargin {firststring:end});
+    bad_usage = true;
   endif
 
-  if (! ishold ())
-    set (ax, "view", [0, 90], "box", "off", "xgrid", "on",
-	 "ygrid", "on", "zgrid", "on");
-  endif
+  if (! bad_usage)
+    ## Make a default surface object.
+    h = __go_surface__ (ax, "xdata", x, "ydata", y, "zdata", z, "cdata", c);
+    set (h, "facecolor","flat");
+    if (firststring < nargin)
+      set (h, varargin {firststring:end});
+     endif
 
-  if (nargout > 0)
-    h = tmp;
-  endif
+     if (! ishold ())
+       set (ax, "view", [0, 90], "box", "off", "xgrid", "on",
+	    "ygrid", "on", "zgrid", "on");
+     endif
+   endif
 
 endfunction