Mercurial > hg > octave-terminal
changeset 7217:c8abc18322b7
[project @ 2007-11-29 20:50:24 by jwe]
author | jwe |
---|---|
date | Thu, 29 Nov 2007 20:50:24 +0000 |
parents | 5389a52df87b |
children | 02eb1619b857 |
files | scripts/ChangeLog scripts/plot/Makefile.in scripts/plot/__stem__.m scripts/plot/stem.m scripts/plot/stem3.m |
diffstat | 5 files changed, 370 insertions(+), 181 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,11 @@ +2007-11-29 David Bateman <dbateman@free.fr> + + * plot/__stem__.m: New file based on old stem.m expanded to treat + 2- and 3-D. + * plot/stem3.m: New function. + * plot/Makefile.in (SOURCES): Add them to the sources. + * plot/stem.m: Adapt to use __stem__. + 2007-11-29 John W. Eaton <jwe@octave.org> * plot/contour.m, plot/contour3.m, plot/fill.m, plot/patch.m,
--- a/scripts/plot/Makefile.in +++ b/scripts/plot/Makefile.in @@ -65,6 +65,7 @@ __pltopt__.m \ __quiver__.m \ __scatter__.m \ + __stem__.m \ ancestor.m \ area.m \ axes.m \ @@ -135,6 +136,7 @@ spinmap.m \ stairs.m \ stem.m \ + stem3.m \ subplot.m \ surf.m \ surface.m \
new file mode 100644 --- /dev/null +++ b/scripts/plot/__stem__.m @@ -0,0 +1,312 @@ +## Copyright (C) 2006, 2007 Michel D. Schmid +## +## 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 + +## Author: Michel D. Schmid <michaelschmid@users.sourceforge.net> +## Adapted-by: jwe + +function h = __stem__ (have_z, varargin) + + [ax, varargin, nargin] = __plt_get_axis_arg__ ("stem", varargin{:}); + + if (nargin < 1 || nargin > 4) + print_usage (); + endif + + [x, y, z, dofill, lc, ls, mc, ms] = check_stem_arg (have_z, varargin{:}); + + if (dofill) + fc = mc; + else + fc = "none"; + endif + + newplot (); + nx = numel (x); + xt = x(:)'; + xt = [xt; xt; NaN(1, nx)](:); + if (have_z) + yt = y(:)'; + yt = [yt; yt; NaN(1, nx)](:); + zt = z(:)'; + zt = [zeros(1, nx); zt; NaN(1, nx)](:); + else + yt = y(:)'; + yt = [zeros(1, nx); yt; NaN(1, nx)](:); + endif + + oldax = gca (); + unwind_protect + axes (ax); + + if (have_z) + h_stems = plot3 (xt, yt, zt, "color", lc, "linestyle", ls, + x, y, z, "color", mc, "marker", ms, "linestyle", "", + "markerfacecolor", fc); + + h_baseline = []; + else + h_stems = plot (xt, yt, "color", lc, "linestyle", ls, + x, y, "color", mc, "marker", ms, "linestyle", "", + "markerfacecolor", fc); + + ## Must draw the plot first to get proper x limits. + drawnow(); + x_axis_range = get (gca, "xlim"); + h_baseline = line (x_axis_range, [0, 0], "color", [0, 0, 0]); + endif + unwind_protect_cleanup + axes (oldax); + end_unwind_protect + + h = [h_stems; h_baseline]; + +endfunction + +function [x, y, z, dofill, lc, ls, mc, ms] = check_stem_arg (have_z, varargin) + + ## set specifiers to default values + [lc, ls, mc, ms] = set_default_values (); + dofill = 0; + fill_2 = 0; + linespec_2 = 0; + z = []; + + ## check input arguments + if (nargin == 2) + if (have_z) + z = varargin{1}; + x = 1 : rows (z); + y = 1 : columns (z); + else + y = varargin{1}; + if (isvector (y)) + x = 1:length(y); + elseif (ismatrix (y)) + x = 1:rows(y); + else + error ("stem: Y must be a matrix"); + endif # in each case, x & y will be defined + endif + elseif (nargin == 3) + ## several possibilities + ## 1. the real y data + ## 2. 'fill' + ## 3. line spec + if (ischar (varargin{2})) + ## only 2. or 3. possible + if (strcmp ("fill", varargin{2})) + dofill = 1; + else + ## parse the linespec + [lc, ls, mc, ms] = stem_line_spec (varargin{2}); + endif + if (have_z) + z = varargin{1}; + x = 1 : rows (z); + y = 1 : columns (z); + else + y = varargin{1}; + if (isvector (y)) + x = 1:length(y); + elseif (ismatrix (y)) + x = 1:rows(y); + else + error ("stem: Y must be a matrix"); + endif # in each case, x & y will be defined + endif + else + if (have_z) + error ("stem3: must define X, Y and Z"); + else + ## must be the real y data + x = varargin{1}; + y = varargin{2}; + if (! (ismatrix (x) && ismatrix (y))) + error ("stem: X and Y must be matrices"); + endif + endif + endif + elseif (nargin == 4) + ## again several possibilities + ## arg2 1. real y + ## arg2 2. 'fill' or linespec + ## arg3 1. real z + ## arg3 2. 'fill' or linespec + if (ischar (varargin{2})) + ## only arg2 2. / arg3 1. & arg3 3. are possible + if (strcmp ("fill", varargin{2})) + dofill = 1; + fill_2 = 1; # be sure, no second "fill" is in the arguments + else + ## must be a linespec + [lc, ls, mc, ms] = stem_line_spec (varargin{2}); + linespec_2 = 1; + endif + if (have_z) + z = varargin{1}; + x = 1 : rows (z); + y = 1 : columns (z); + else + y = varargin{1}; + if (isvector (y)) + x = 1:length(y); + elseif (ismatrix (y)) + x = 1:size(y,1); + else + error ("stem: Y must be a matrix"); + endif # in each case, x & y will be defined + endif + else + if (have_z) + x = varargin{1}; + y = varargin{2}; + z = varargin{3}; + if (! (ismatrix (x) && ismatrix (y) && ismatrix (z))) + error ("stem3: X, Y and Z must be matrices"); + endif + else + ## must be the real y data + x = varargin{1}; + y = varargin{2}; + if (! (ismatrix (x) && ismatrix (y))) + error ("stem: X and Y must be matrices"); + endif + endif + endif # if ischar(varargin{2}) + if (! have_z) + ## varargin{3} must be char... + ## check for "fill" .. + if (strcmp ("fill", varargin{3}) & fill_2) + error ("stem:check_stem_arg: duplicate fill argument"); + elseif (strcmp("fill", varargin{3}) & linespec_2) + ## must be "fill" + dofill = 1; + fill_2 = 1; + elseif (strcmp ("fill", varargin{3}) & ! linespec_2) + ## must be "fill" + dofill = 1; + fill_2 = 1; + elseif (! linespec_2) + ## must be linespec + [lc, ls, mc, ms] = stem_line_spec (varargin{3}); + linespec_2 = 1; + endif + endif + elseif (nargin == 5) + if (have_z) + x = varargin{1}; + y = varargin{2}; + z = varargin{3}; + if (! (ismatrix (x) && ismatrix (y) && ismatrix (z))) + error ("stem3: X, Y and Z must be matrices"); + endif + else + x = varargin{1}; + y = varargin{2}; + if (! (ismatrix (x) && ismatrix (y))) + error ("X and Y must be matrices"); + endif + endif + + if (! have_z) + if (strcmp ("fill", varargin{3})) + dofill = 1; + fill_2 = 1; # be sure, no second "fill" is in the arguments + else + ## must be a linespec + [lc, ls, mc, ms] = stem_line_spec (varargin{3}); + linespec_2 = 1; + endif + endif + + ## check for "fill" .. + if (strcmp ("fill", varargin{4}) & fill_2) + error ("stem:check_stem_arg: duplicate fill argument"); + elseif (strcmp ("fill", varargin{4}) & linespec_2) + ## must be "fill" + dofill = 1; + fill_2 = 1; + elseif (! strcmp ("fill", varargin{4}) & ! linespec_2) + ## must be linespec + [lc, ls, mc, ms] = stem_line_spec (varargin{4}); + linespec_2 = 1; + endif + elseif (nargin == 6 && have_z) + x = varargin{1}; + y = varargin{2}; + z = varargin{3}; + if (! (ismatrix (x) && ismatrix (y) && ismatrix (z))) + error ("stem3: X, Y and Z must be matrices"); + endif + + if (strcmp ("fill", varargin{4})) + dofill = 1; + fill_2 = 1; # be sure, no second "fill" is in the arguments + else + ## must be a linespec + [lc, ls, mc, ms] = stem_line_spec (varargin{4}); + linespec_2 = 1; + endif + + ## check for "fill" .. + if (strcmp ("fill", varargin{5}) & fill_2) + error ("stem3:check_stem_arg: duplicate fill argument"); + elseif (strcmp ("fill", varargin{5}) & linespec_2) + ## must be "fill" + dofill = 1; + fill_2 = 1; + elseif (! strcmp ("fill", varargin{5}) & ! linespec_2) + ## must be linespec + [lc, ls, mc, ms] = stem_line_spec (varargin{5}); + linespec_2 = 1; + endif + elseif (have_z) + error ("stem3: incorrect number of arguments"); + else + error ("stem: incorrect number of arguments"); + endif + +endfunction + +function [lc, ls, mc, ms] = stem_line_spec (str) + if (! ischar (str)) + error ("stem:stem_line_spec: wrong argument type, must be \"fill\" or a string of specifiers"); + endif + [lc, ls, mc, ms] = set_default_values (); + ## Parse the line specifier string. + cur_props = __pltopt__ ("stem", str, false); + for i = 1:length(cur_props) + if (isfield (cur_props(i), "color") && ! isempty (cur_props(i).color)); # means line color + mc = lc = cur_props(i).color; + elseif (isfield (cur_props(i), "linestyle")) + ls = cur_props(i).linestyle; + elseif (isfield (cur_props(i), "marker") && ! strcmp (cur_props(i).marker, "none")) + ms = cur_props(i).marker; + endif + endfor +endfunction + +function [lc, ls, mc, ms] = set_default_values () + ## set default values + mc = [1, 0, 0]; + lc = [1, 0, 0]; + ls = "-"; + ms = "o"; +endfunction
--- a/scripts/plot/stem.m +++ b/scripts/plot/stem.m @@ -94,189 +94,10 @@ function h = stem (varargin) - if (nargin < 1 || nargin > 4) - print_usage (); - endif - - [x, y, dofill, lc, ls, mc, ms] = check_stem_arg (varargin{:}); - - if (dofill) - fc = mc; - else - fc = "none"; - endif - - newplot (); - nx = numel (x); - xt = x(:)'; - xt = [xt; xt; NaN(1, nx)](:); - yt = y(:)'; - yt = [zeros(1, nx); yt; NaN(1, nx)](:); - h_stems = plot (xt, yt, "color", lc, "linestyle", ls, - x, y, "color", mc, "marker", ms, "linestyle", "", - "markerfacecolor", fc); - - ## Must draw the plot first to get proper x limits. - drawnow(); - x_axis_range = get (gca, "xlim"); - h_baseline = line (x_axis_range, [0, 0], "color", [0, 0, 0]); + tmp = __stem__ (false, varargin{:}); if (nargout > 0) - h = [h_stems; h_baseline]; + h = tmp; endif endfunction - -function [x, y, dofill, lc, ls, mc, ms] = check_stem_arg (varargin) - - ## set specifiers to default values - [lc, ls, mc, ms] = set_default_values (); - dofill = 0; - fill_2 = 0; - linespec_2 = 0; - - ## check input arguments - if (nargin == 1) - y = varargin{1}; - if (isvector (y)) - x = 1:length(y); - elseif (ismatrix (y)) - x = 1:rows(y); - else - error ("stem: Y must be a matrix"); - endif # in each case, x & y will be defined - - elseif (nargin == 2) - ## several possibilities - ## 1. the real y data - ## 2. 'fill' - ## 3. line spec - if (ischar (varargin{2})) - ## only 2. or 3. possible - if (strcmp ("fill", varargin{2})) - dofill = 1; - else - ## parse the linespec - [lc, ls, mc, ms] = stem_line_spec (varargin{2}); - endif - y = varargin{1}; - if (isvector (y)) - x = 1:length(y); - elseif (ismatrix (y)) - x = 1:rows(y); - else - error ("stem: Y must be a matrix"); - endif # in each case, x & y will be defined - else - ## must be the real y data - x = varargin{1}; - y = varargin{2}; - if (! (ismatrix (x) && ismatrix (y))) - error ("stem: X and Y must be matrices"); - endif - endif - elseif (nargin == 3) - ## again several possibilities - ## arg2 1. real y - ## arg2 2. 'fill' or linespec - ## arg3 1. 'fill' or linespec - if (ischar (varargin{2})) - ## only arg2 2. / arg3 1. & arg3 3. are possible - if (strcmp ("fill", varargin{2})) - dofill = 1; - fill_2 = 1; # be sure, no second "fill" is in the arguments - else - ## must be a linespec - [lc, ls, mc, ms] = stem_line_spec (varargin{2}); - linespec_2 = 1; - endif - y = varargin{1}; - if (isvector (y)) - x = 1:length(y); - elseif (ismatrix (y)) - x = 1:size(y,1); - else - error ("stem: Y must be a matrix"); - endif # in each case, x & y will be defined - else - ## must be the real y data - x = varargin{1}; - y = varargin{2}; - if (! (ismatrix (x) && ismatrix (y))) - error ("stem: X and Y must be matrices"); - endif - endif # if ischar(varargin{2}) - ## varargin{3} must be char... - ## check for "fill" .. - if (strcmp ("fill", varargin{3}) & fill_2) - error ("stem:check_stem_arg: duplicate fill argument"); - elseif (strcmp("fill", varargin{3}) & linespec_2) - # must be "fill" - dofill = 1; - fill_2 = 1; - elseif (strcmp ("fill", varargin{3}) & ! linespec_2) - ## must be "fill" - dofill = 1; - fill_2 = 1; - elseif (! linespec_2) - ## must be linespec - [lc, ls, mc, ms] = stem_line_spec (varargin{3}); - linespec_2 = 1; - endif - elseif (nargin == 4) - x = varargin{1}; - y = varargin{2}; - if (! (ismatrix (x) && ismatrix (y))) - error ("X and Y must be matrices"); - endif - - if (strcmp ("fill", varargin{3})) - dofill = 1; - fill_2 = 1; # be sure, no second "fill" is in the arguments - else - ## must be a linespec - [lc, ls, mc, ms] = stem_line_spec (varargin{3}); - linespec_2 = 1; - endif - - ## check for "fill" .. - if (strcmp ("fill", varargin{4}) & fill_2) - error ("stem:check_stem_arg: duplicate fill argument"); - elseif (strcmp ("fill", varargin{4}) & linespec_2) - ## must be "fill" - dofill = 1; - fill_2 = 1; - elseif (! strcmp ("fill", varargin{4}) & ! linespec_2) - ## must be linespec - [lc, ls, mc, ms] = stem_line_spec (varargin{4}); - linespec_2 = 1; - endif - endif - -endfunction - -function [lc, ls, mc, ms] = stem_line_spec (str) - if (! ischar (str)) - error ("stem:stem_line_spec: wrong argument type, must be \"fill\" or a string of specifiers"); - endif - [lc, ls, mc, ms] = set_default_values (); - ## Parse the line specifier string. - cur_props = __pltopt__ ("stem", str, false); - for i = 1:length(cur_props) - if (isfield (cur_props(i), "color") && ! isempty (cur_props(i).color)); # means line color - mc = lc = cur_props(i).color; - elseif (isfield (cur_props(i), "linestyle")) - ls = cur_props(i).linestyle; - elseif (isfield (cur_props(i), "marker") && ! strcmp (cur_props(i).marker, "none")) - ms = cur_props(i).marker; - endif - endfor -endfunction - -function [lc, ls, mc, ms] = set_default_values () - ## set default values - mc = [1, 0, 0]; - lc = [1, 0, 0]; - ls = "-"; - ms = "o"; -endfunction
new file mode 100644 --- /dev/null +++ b/scripts/plot/stem3.m @@ -0,0 +1,46 @@ +## 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} {@var{h} =} stem3 (@var{x}, @var{y}, @var{z}, @var{linespec}) +## Plot a three-dimensional stem graph and return the handles of the line +## and marker objects used to draw the stems. The default color is @code{"r"} +## (red). The default line style is @code{"-"} and the default marker is +## @code{"o"}. +## +## For example, +## @example +## theta = 0:0.2:6; +## stem3 (cos (theta), sin (theta), theta) +## @end example +## +## @noindent +## plots 31 stems with heights from 0 to 6 lying on a circle. Color +## definitions with rgb-triples are not valid! +## @seealso{bar, barh, stem, plot} +## @end deftypefn + +function h = stem3 (varargin) + + tmp = __stem__ (true, varargin{:}); + + if (nargout > 0) + h = tmp; + endif + +endfunction