Mercurial > hg > octave-terminal
changeset 11330:4f399d91eb32
add pie3 to plot functions
author | Kai Habel <kai.habel@gmx.de> |
---|---|
date | Thu, 09 Dec 2010 16:17:03 +0100 |
parents | 6b073da9d7fc |
children | 874f2a0fdd19 |
files | ChangeLog NEWS doc/ChangeLog doc/interpreter/plot.txi scripts/ChangeLog scripts/miscellaneous/unimplemented.m scripts/plot/module.mk scripts/plot/pie.m scripts/plot/pie3.m scripts/plot/private/__pie__.m src/ChangeLog |
diffstat | 11 files changed, 291 insertions(+), 100 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2010-12-09 Kai Habel <kai.habel@gmx.de> + + * NEWS: Add pie3 to new functions list. + 2010-12-09 Marco Atzeri <marcox_atzeri@yahoo.it> * configure.ac: Don't add -lwsock32 to LIBS on cygwin systems.
--- a/NEWS +++ b/NEWS @@ -313,14 +313,14 @@ ** The following functions are new in Octave 3.4: - accumdim fileread nfields pqpnonneg textread - bitpack fminbnd nth_element randi uigetdir - bitunpack fskipl onCleanup repelems uigetfile - blkmm ifelse pbaspect reset uiputfile - cbrt ishermitian powerset rsf2csf uimenu - chop isindex ppder saveas whitebg - daspect luupdate ppint sizemax - erfcx merge ppjumps strread + accumdim fileread nfields ppjumps strread + bitpack fminbnd nth_element pqpnonneg textread + bitunpack fskipl onCleanup randi uigetdir + blkmm ifelse pbaspect repelems uigetfile + cbrt ishermitian pie3 reset uiputfile + chop isindex powerset rsf2csf uimenu + daspect luupdate ppder saveas whitebg + erfcx merge ppint saveas ** Using the image function to view images with external programs such
--- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,7 @@ +2010-12-09 Kai Habel <kai.habel@gmx.de> + + * interpreter/plot.txi: Add pie3 function. + 2010-11-26 John W. Eaton <jwe@octave.org> * interpreter/install.txi (Compiling Octave with 64-bit
--- a/doc/interpreter/plot.txi +++ b/doc/interpreter/plot.txi @@ -202,6 +202,8 @@ @DOCSTRING(pie) +@DOCSTRING(pie3) + @DOCSTRING(quiver) @DOCSTRING(quiver3)
--- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,11 @@ +2010-12-09 Kai Habel <kai.habel@gmx.de> + + * (plot/pie3.m, plot/private/__pie__.m): New functions. + * (plot/pie.m): Move __pie__ function to plot/private, in order to be used + by pie and pie3. + * miscellaneous/unimplemented.m: Remove pie3.m from list of + unimplemented functions. + 2010-12-09 John W. Eaton <jwe@octave.org> * time/datestr.m: Don't call localtime (mktime (tm)) to fill in
--- a/scripts/miscellaneous/unimplemented.m +++ b/scripts/miscellaneous/unimplemented.m @@ -314,7 +314,6 @@ "pcode", "pdepe", "pdeval", - "pie3", "playshow", "plotbrowser", "plotedit",
--- a/scripts/plot/module.mk +++ b/scripts/plot/module.mk @@ -24,6 +24,7 @@ plot/private/__interp_cube__.m \ plot/private/__line__.m \ plot/private/__patch__.m \ + plot/private/__pie__.m \ plot/private/__plt__.m \ plot/private/__pltopt__.m \ plot/private/__quiver__.m \ @@ -123,6 +124,7 @@ plot/pcolor.m \ plot/peaks.m \ plot/pie.m \ + plot/pie3.m \ plot/plot.m \ plot/plot3.m \ plot/plotmatrix.m \
--- a/scripts/plot/pie.m +++ b/scripts/plot/pie.m @@ -36,7 +36,7 @@ ## ## The optional return value @var{h} provides a handle to the patch object. ## -## @seealso{bar, stem} +## @seealso{pie3, bar, stem} ## @end deftypefn ## Very roughly based on pie.m from octave-forge whose author was @@ -53,7 +53,7 @@ unwind_protect axes (h); newplot (); - tmp = __pie__ (h, varargin{:}); + tmp = __pie__ ("pie", h, varargin{:}); unwind_protect_cleanup axes (oldh); end_unwind_protect @@ -65,94 +65,6 @@ 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); - - have_explode = false; - have_labels = false; - - while (iarg <= nargin) - arg = varargin{iarg++}; - if (iscell (arg)) - labels = arg; - have_labels = true; - if (numel (x) != numel (labels)) - error ("pie: mismatch in number of labels and data"); - endif - elseif (isnumeric (arg)) - explode = arg; - have_explode = true; - if (! size_equal (x, explode)) - error ("pie: mismatch in number of elements in explode and data"); - endif - endif - endwhile - - if (! have_explode) - explode = zeros (size (x)); - endif - - if (! have_labels) - 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(end) != 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], "square"); - -endfunction - %!demo %! pie ([3, 2, 1], [0, 0, 1]); %! colormap([1,0,0;0,1,0;0,0,1;1,1,0;1,0,1;0,1,1]);
new file mode 100644 --- /dev/null +++ b/scripts/plot/pie3.m @@ -0,0 +1,77 @@ +## Copyright (C) 2007, 2008, 2009 David Bateman +## Copyright (C) 2010 Kai Habel +## +## 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} {} pie3 (@var{y}) +## @deftypefnx {Function File} {} pie3 (@var{y}, @var{explode}) +## @deftypefnx {Function File} {} pie3 (@dots{}, @var{labels}) +## @deftypefnx {Function File} {} pie3 (@var{h}, @dots{}); +## @deftypefnx {Function File} {@var{h} =} pie3 (@dots{}); +## Drawa a 3D pie chart. +## +## Called with a single vector argument, produces a 3D 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 list to patch, surface +## and text objects generating this plot. +## +## @seealso{pie, 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 = pie3 (varargin) + + [h, varargin] = __plt_get_axis_arg__ ("pie", varargin{:}); + + if (nargin < 1) + print_usage (); + else + oldh = gca (); + unwind_protect + axes (h); + newplot (); + tmp = __pie__ ("pie3", h, varargin{:}); + unwind_protect_cleanup + axes (oldh); + end_unwind_protect + endif + + if (nargout > 0) + retval = tmp; + endif + +endfunction + +%!demo +%! pie3 ([5:-1:1], [0, 0, 1, 0, 0]); +%! colormap([1,0,0;0,1,0;0,0,1;1,1,0;1,0,1;0,1,1]); + +%!demo +%! pie3 ([3, 2, 1], [0, 0, 1], {"Cheddar", "Swiss", "Camembert"}); +%! colormap([1,0,0;0,1,0;0,0,1;1,1,0;1,0,1;0,1,1]); +%! axis ([-2,2,-2,2]);
new file mode 100644 --- /dev/null +++ b/scripts/plot/private/__pie__.m @@ -0,0 +1,183 @@ +## Copyright (C) 2007, 2008, 2009 David Bateman +## Copyright (C) 2010 Kai Habel +## +## 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{hlist} =} __pie__ (caller, @dots{}) +## Undocumented internal function. +## @end deftypefn + +function hlist = __pie__ (caller, varargin) + + h = varargin{1}; + x = abs (varargin{2}); + iarg = 3; + + if (! isvector (x)) + error ("__pie__: expecting vector argument"); + endif + + len = length (x); + + have_explode = false; + have_labels = false; + + while (iarg <= nargin - 1) + arg = varargin{iarg++}; + if (iscell (arg)) + labels = arg; + have_labels = true; + if (numel (x) != numel (labels)) + error ("__pie__: mismatch in number of labels and data"); + endif + elseif (isnumeric (arg)) + explode = arg; + have_explode = true; + if (! size_equal (x, explode)) + error ("__pie__: mismatch in number of elements in explode and data"); + endif + endif + endwhile + + if (! have_explode) + explode = zeros (size (x)); + endif + + if (! have_labels) + 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(end) != 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 (len == 1) + set (h, "clim", [1, 2]); + else + set (h, "clim", [1, len]); + endif + + if (strncmp (caller, "pie3", 4)) + ln = length (xn); + zlvl = 0.35; + sx = repmat (xoff + [0, - sind(xn), 0], [2 1]); + sy = repmat (yoff + [0, cosd(xn), 0], [2 1]); + sz = [zeros(1, ln + 2); zlvl * ones(1, ln + 2)]; + sc = i * ones (size (sz)); + + hlist = [hlist; + patch(xoff + [0, - sind(xn)], yoff + [0, cosd(xn)], zeros (1, ln + 1), i); + surface(sx, sy, sz, sc); + patch(xoff + [0, - sind(xn)], yoff + [0, cosd(xn)], zlvl * ones (1, ln + 1), i); + text(xt, yt, zlvl, labels{i})]; + + elseif (strncmp (caller, "pie", 3)) + 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)]; + + else + error ("__pie__: unknown caller"); + endif + endfor + + addlistener(gca, "view", {@update_text_pos, hlist}); + + if (strncmp (caller, "pie3", 4)) + axis ([-1.25, 1.25, -1.25, 1.25, -0.05, 0.4], "equal", "off") + view (-37.5, 30); + elseif (strncmp (caller, "pie", 3)) + axis ([-1.5, 1.5, -1.5, 1.5], "square", "off"); + endif +endfunction + +function update_text_pos (all_handles) + ## Text objects in the foreground should be at the base level. + ## Text objects in the background should be at the top level. + ## Text objects on the right side should be aligned to the right + ## and on the left side to the left. + tobj = findobj (all_handles, "type", "text"); + + ## check if we are called from pie3 + s = findobj (all_handles, "type", "surface"); + is_pie3 = false; + if (length (s) > 0) + is_pie3 = true; + endif + + if (length (tobj) > 0) + ax = get (tobj(1), "parent"); + azel = get (ax, "view"); + pos = get (tobj, "position"); + if (iscell (pos)) + pos = cell2mat (pos); + endif + phi = atand (pos(:,1) ./ pos(:,2)); + [theta, r] = cart2pol (pos(:,1), pos(:,2)); + theta *= 180/pi; + theta -= azel(1); + theta = mod (theta, 360); + ud_mask = (theta > 180); + lr_mask = (theta > 90) & (theta < 270); + for i = 1 : length (tobj) + if (is_pie3) + if (ud_mask(i)) + set (tobj(i), "position", [pos(i,1), pos(i,2), -0.05]) + else + set (tobj(i), "position", [pos(i,1), pos(i,2), 0.40]) + endif + endif + + if (lr_mask(i)) + set (tobj(i), "horizontalalignment", "right") + else + set (tobj(i), "horizontalalignment", "left") + endif + endfor + endif +endfunction