# HG changeset patch # User Ben Abbott # Date 1264730371 18000 # Node ID ce94aaa71a4f1ec8c962dc598319d7fe764efaab # Parent db7fdd6a15129a6e6514a7409a7fbd16d59f753e daspect.m, pbaspect.m: New functions. diff --git a/scripts/ChangeLog b/scripts/ChangeLog --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,7 @@ +2010-01-28 Ben Abbott + + * plot/daspect.m, plot/pbaspect.m: New functions. + 2010-01-28 John W. Eaton * general/Makefile.am (general_FCN_FILES): Add chop.m to the list. diff --git a/scripts/plot/daspect.m b/scripts/plot/daspect.m new file mode 100644 --- /dev/null +++ b/scripts/plot/daspect.m @@ -0,0 +1,100 @@ +## Copyright (C) 2010 Ben Abbott +## +## This program 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 2 of the License, or +## (at your option) any later version. +## +## This program 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} {} daspect (@var{data_aspect_ratio}) +## Set the data aspect ratio of the current axes. The aspect ratio is +## a normalized 3 element vector representing the span of the x, y, and +## z-axes limits. +## @deftypefnx {Function File} {@var{data_aspect_ratio} =} daspect ( ) +## Return the data aspect ratio of the current axes. +## @deftypefnx {Function File} {} daspect (@var{mode}) +## Set the data aspect ratio mode of the current axes. +## @deftypefnx {Function File} {@var{data_aspect_ratio_mode} =} daspect ("mode") +## Return the data aspect ratio mode of the current axes. +## @deftypefnx {Function File} {} daspect (@var{hax}, @dots{}) +## Uses the axes, with handle @var{hax}, instead of the current axes. +## +## @seealso{axis, pbaspect, xlim, ylim, zlim} +## @end deftypefn + +## Author: Ben Abbott +## Created: 2010-01-26 + +function varargout = daspect (varargin) + + hax = gca (); + + if (nargin > 0) + if (isscalar (varargin{1}) && ishandle (varargin{1})) + hax = varargin{1}; + varargin = varargin(2:end); + endif + endif + if (numel (varargin) > 0) + if (numel (varargin) == 1) + if (ischar (varargin{1}) + && any (strcmpi (varargin{1}, {"mode", "manual", "auto"}))) + switch varargin{1} + case {"mode"} + if (nargout < 2) + varargout{1} = get (hax, "dataaspectratiomode"); + return + else + error ("daspect: only one output is allowed.") + end + case {"manual"} + set (hax, "dataaspectratiomode", "manual"); + case {"auto"} + set (hax, "dataaspectratiomode", "auto"); + endswitch + elseif (isreal (varargin{1}) + && any (numel (varargin{1}) == [2 3])) + set (hax, "dataaspectratio", varargin{1}) + else + error ("daspect: invalid input.") + endif + elseif (numel (varargin) > 1) + error ("daspect: too many inputs.") + endif + elseif (nargout == 0) + print_usage (); + end + + if (nargout == 1) + varargout{1} = get (hax, "dataaspectratio"); + elseif (nargout > 1) + error ("daspect: only one output is allowed.") + end + +endfunction + +%!demo +%! x = 0:0.01:4; +%! clf +%! plot (x, cos (x), x, sin (x)) +%! axis square +%! daspect ([1 1 1]) +%! title ("axis limits should be [0, 4, -2, 2]") + +%!demo +%! x = 0:0.01:4; +%! clf +%! plot (x, cos (x), x, sin (x)) +%! axis ([0 4 -1 1]) +%! daspect ([2 1 1]) +%! title ("axis box should be square") + diff --git a/scripts/plot/module.mk b/scripts/plot/module.mk --- a/scripts/plot/module.mk +++ b/scripts/plot/module.mk @@ -63,6 +63,7 @@ plot/contourc.m \ plot/contourf.m \ plot/cylinder.m \ + plot/daspect.m \ plot/diffuse.m \ plot/ellipsoid.m \ plot/errorbar.m \ @@ -113,6 +114,7 @@ plot/orient.m \ plot/pareto.m \ plot/patch.m \ + plot/pbaspect.m \ plot/pcolor.m \ plot/peaks.m \ plot/pie.m \ diff --git a/scripts/plot/pbaspect.m b/scripts/plot/pbaspect.m new file mode 100644 --- /dev/null +++ b/scripts/plot/pbaspect.m @@ -0,0 +1,98 @@ +## Copyright (C) 2010 Ben Abbott +## +## This program 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 2 of the License, or +## (at your option) any later version. +## +## This program 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} {} pbaspect (@var{plot_box_aspect_ratio}) +## Set the plot box aspect ratio of the current axes. The aspect ratio +## is a normalized 3 element vector representing the rendered lengths of +## the x, y, and z-axes. +## @deftypefnx {Function File} {@var{plot_box_aspect_ratio} =} pbaspect ( ) +## Return the plot box aspect ratio of the current axes. +## @deftypefnx {Function File} {} pbaspect (@var{mode}) +## Set the plot box aspect ratio mode of the current axes. +## @deftypefnx {Function File} {@var{plot_box_aspect_ratio_mode} =} pbaspect ("mode") +## Return the plot box aspect ratio mode of the current axes. +## @deftypefnx {Function File} {} pbaspect (@var{hax}, @dots{}) +## Uses the axes, with handle @var{hax}, instead of the current axes. +## +## @seealso{axis, daspect, xlim, ylim, zlim} +## @end deftypefn + +## Author: Ben Abbott +## Created: 2010-01-26 + +function varargout = pbaspect (varargin) + + hax = gca (); + + if (nargin > 0) + if (isscalar (varargin{1}) && ishandle (varargin{1})) + hax = varargin{1}; + varargin = varargin(2:end); + endif + endif + if (numel (varargin) > 0) + if (numel (varargin) == 1) + if (ischar (varargin{1}) + && any (strcmpi (varargin{1}, {"mode", "manual", "auto"}))) + switch varargin{1} + case {"mode"} + if (nargout < 2) + varargout{1} = get (hax, "plotboxaspectratiomode"); + return + else + error ("pbaspect: only one output is allowed.") + end + case {"manual"} + set (hax, "plotboxaspectratiomode", "manual"); + case {"auto"} + set (hax, "plotboxaspectratiomode", "auto"); + endswitch + elseif (isreal (varargin{1}) + && any (numel (varargin{1}) == [2 3])) + set (hax, "plotboxaspectratio", varargin{1}) + else + error ("pbaspect: invalid input.") + endif + elseif (numel (varargin) > 1) + error ("pbaspect: too many inputs.") + endif + elseif (nargout == 0) + print_usage (); + end + + if (nargout == 1) + varargout{1} = get (hax, "plotboxaspectratio"); + elseif (nargout > 1) + error ("pbaspect: only one output is allowed.") + end + +endfunction + +%!demo +%! x = 0:0.01:4; +%! clf +%! plot (x, cos (x), x, sin (x)) +%! pbaspect ([1 1 1]) +%! title ('plot box should be square') + +%!demo +%! x = 0:0.01:4; +%! clf +%! plot (x, cos (x), x, sin (x)) +%! pbaspect ([2 1 1]) +%! title ('plot box aspect ratio should be 2x1') +