Mercurial > hg > octave-terminal
changeset 7118:d32f867e4dda
[project @ 2007-11-07 20:44:11 by jwe]
author | jwe |
---|---|
date | Wed, 07 Nov 2007 20:44:29 +0000 |
parents | 373c39904877 |
children | d22ad51b9cf8 |
files | scripts/ChangeLog scripts/plot/Makefile.in scripts/plot/pie.m scripts/plot/surfc.m |
diffstat | 4 files changed, 236 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,9 @@ +2007-11-07 David Bateman <dbateman@free.fr> + + * plot/surfc.m, plot/meshc.m: New files. + * plot/Makefile.in (SOURCES): Add them to the list. + Also add pcolor.m, shading.m, surf.m, and surface.m to the list. + 2007-11-07 Michael Zeising <michael@michaels-website.de> * audio/wavwrite.m, audio/wavwrite.m: Correct sample scaling.
--- a/scripts/plot/Makefile.in +++ b/scripts/plot/Makefile.in @@ -96,7 +96,9 @@ newplot.m \ orient.m \ patch.m \ + pcolor.m \ peaks.m \ + pie.m \ plot.m \ plot3.m \ polar.m \ @@ -106,11 +108,15 @@ semilogxerr.m \ semilogy.m \ semilogyerr.m \ + shading.m \ shg.m \ sombrero.m \ stairs.m \ stem.m \ subplot.m \ + surf.m \ + surface.m \ + surfc.m \ text.m \ title.m \ view.m \
new file mode 100644 --- /dev/null +++ b/scripts/plot/pie.m @@ -0,0 +1,150 @@ +## 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} {} pie (@var{y}) +## @deftypefnx {Function File} {} pie (@var{y}, @var{explode}) +## @deftypefnx {Function File} {} pie (@dots{}, @var{labels}) +## @deftypefnx {Function File} {} pie (@var{h}, @dots{}); +## @deftypefnx {Function File} {@var{h} =} pie (@dots{}); +## Produce a pie chart. +## +## Called with a single vector arrgument, produces a pie chart of the +## elements in @var{x}, with the size of the slice determined by percentage +## size of the values of @var{x}. +## +## The variable @var{explode} is a vector of the same length as @var{x} that +## if non zero 'explodes' the slice from the pie chart. +## +## If given @var{labels} is a cell array of strings of the same length as +## @var{x}, giving the labels of each of the slices of the pie chart. +## +## The optional return value @var{h} provides a handle to the patch object. +## +## @seealso{bar, stem} +## @end deftypefn + +## Very roughly based on pie.m from octave-forge whose author was +## Daniel Heiserer <Daniel.heiserer@physik.tu-muenchen.de> + +function retval = pie (varargin) + + if (nargin < 1) + print_usage (); + elseif (isscalar (varargin{1}) && ishandle (varargin{1})) + h = varargin {1}; + if (! strcmp (get (h, "type"), "axes")) + error ("pie: expecting first argument to be an axes object"); + endif + oldh = gca (); + unwind_protect + axes (h); + newplot (); + tmp = __pie__ (h, varargin{2:end}); + unwind_protect_cleanup + axes (oldh); + end_unwind_protect + else + newplot (); + tmp = __pie__ (gca (), varargin{:}); + endif + + if (nargout > 0) + retval = tmp; + endif +endfunction + +function hlist = __pie__ (varargin) + h = varargin{1}; + x = abs (varargin{2}); + iarg = 3; + + if (! isvector (x)) + error ("pie: expecting vector argument"); + endif + + len = length (x); + + while (iarg <= nargin) + arg = varargin {iarg++}; + if (iscell (arg)) + labels = arg; + if (! size_equal (x, labels)) + error ("pie: mismatch in number of labels and data"); + endif + elseif (isnumeric (arg)) + explode = arg; + if (! size_equal (x, explode)) + error ("pie: mismatch in number of elements in explode and data"); + endif + endif + endwhile + + if (! exist ("explode", "var")) + explode = zeros (size (x)); + endif + + if (! exist ("labels", "var")) + xp = round (100 * x ./ sum (x)); + for i = 1 : len + labels{i} = sprintf ("%d%%", xp(i)); + endfor + endif + + hlist = []; + refinement = 90; + phi = 0 : refinement : 360; + xphi = cumsum (x / sum(x) * 360); + for i = 1 : len + if (i == 1) + xn = 0 : 360 / refinement : xphi(i); + else + xn = xphi(i-1) : 360 / refinement : xphi(i); + endif + + if (xn (length (xn)) != xphi(i)) + xn = [xn, xphi(i)]; + endif + + xn2 = (xn(1) + xn(end)) / 2; + if (explode (i)) + xoff = - 0.1 * sind (xn2); + yoff = 0.1 * cosd (xn2); + else + xoff = 0; + yoff = 0; + endif + xt = - 1.2 * sind (xn2); + yt = 1.2 * cosd (xn2); + if (xt > 0) + align = "left"; + else + align = "right"; + endif + + hlist = [hlist; patch(xoff + [0, - sind(xn)], yoff + [0, cosd(xn)], i); + text(xt, yt, labels {i}, "HorizontalAlignment", align)]; + endfor + if (len == 1) + set (h, "clim", [1, 2]); + else + set (h, "clim", [1, len]); + endif + axis ([-1.5,1.5,-1.5,1.5]); +endfunction +
new file mode 100644 --- /dev/null +++ b/scripts/plot/surfc.m @@ -0,0 +1,74 @@ +## Copyright (C) 1996, 1997, 2007 John W. Eaton +## +## 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} {} surfc (@var{x}, @var{y}, @var{z}) +## Plot a surface and contour 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, surf, contour} +## @end deftypefn + +function h = surfc (varargin) + + newplot (); + + tmp = surface (varargin{:}); + + ax = get (tmp, "parent"); + + set (tmp, "facecolor", "flat"); + + set (ax, "view", [-37.5, 30]); + + hold on; + + [c, lev] = contourc (varargin{:}); + + cmap = get (gcf(), "colormap"); + + levx = linspace (min (lev), max (lev), size (cmap, 1)); + + drawnow(); + ax = axis(); + zmin = 2 * ax(5) - ax(6); + + ## decode contourc output format + i1 = 1; + while (i1 < length (c)) + + clev = c(1,i1); + clen = c(2,i1); + + ccr = interp1 (levx, cmap(:,1), clev); + ccg = interp1 (levx, cmap(:,2), clev); + ccb = interp1 (levx, cmap(:,3), clev); + + ii = i1+1:i1+clen; + line (c(1,ii), c(2,ii), zmin*ones(size(ii)), "color", [ccr, ccg, ccb]); + + i1 += c(2,i1)+1; + endwhile + + if (nargout > 0) + h = tmp; + endif +endfunction