# HG changeset patch # User jwe # Date 1196216448 0 # Node ID 71c03c7239fb5949d3fd7197429660f87c8421a1 # Parent 6e4ceeeb19404e6632c4b7395352862b48701642 [project @ 2007-11-28 02:19:25 by jwe] diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/ChangeLog --- 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 + * 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 diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/Makefile.in --- 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 \ diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/errorbar.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 diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/loglog.m --- 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 diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/loglogerr.m --- 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 diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/meshc.m --- 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{:}); diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/meshz.m --- /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 +## . + +## -*- 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 diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/polar.m --- 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 diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/semilogx.m --- 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 diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/semilogxerr.m --- 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 diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/semilogy.m --- 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 diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/semilogyerr.m --- 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 diff -r 6e4ceeeb1940 -r 71c03c7239fb scripts/plot/surface.m --- 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