# HG changeset patch # User jwe # Date 1196378048 0 # Node ID 66081694ffb887021c0bc99cfade2cf5d98a03cd # Parent ef3fad1f36da4257ac02342ab0ffe01c4a826360 [project @ 2007-11-29 23:14:07 by jwe] diff -r ef3fad1f36da -r 66081694ffb8 scripts/ChangeLog --- a/scripts/ChangeLog Thu Nov 29 22:13:29 2007 +0000 +++ b/scripts/ChangeLog Thu Nov 29 23:14:08 2007 +0000 @@ -1,5 +1,12 @@ 2007-11-29 David Bateman + * plot/pareto.m: New file. + * plot/Makefile.in (SOURCES): Add it to the sources. + * plot/__go_draw_axes__.m (do_tics1): Replace "%" with "%%" in tic + marks to avoid gnuplot error about formating. More colorspec to + after the tics. + * plot/plotyy.m: More generic check for appropriate axis color. + * plot/__stem__.m: New file based on old stem.m expanded to treat 2- and 3-D. * plot/stem3.m: New function. diff -r ef3fad1f36da -r 66081694ffb8 scripts/plot/Makefile.in --- a/scripts/plot/Makefile.in Thu Nov 29 22:13:29 2007 +0000 +++ b/scripts/plot/Makefile.in Thu Nov 29 23:14:08 2007 +0000 @@ -108,6 +108,7 @@ ndgrid.m \ newplot.m \ orient.m \ + pareto.m \ patch.m \ pcolor.m \ peaks.m \ diff -r ef3fad1f36da -r 66081694ffb8 scripts/plot/__go_draw_axes__.m --- a/scripts/plot/__go_draw_axes__.m Thu Nov 29 22:13:29 2007 +0000 +++ b/scripts/plot/__go_draw_axes__.m Thu Nov 29 23:14:08 2007 +0000 @@ -1590,12 +1590,13 @@ nlabels = numel (labels); fprintf (plot_stream, "set format %s \"%%s\";\n", ax); if (mirror) - fprintf (plot_stream, "set %stics %s (", ax, colorspec); + fprintf (plot_stream, "set %stics (", ax); else - fprintf (plot_stream, "set %stics nomirror %s (", ax, colorspec); + fprintf (plot_stream, "set %stics nomirror (", ax); endif for i = 1:ntics - fprintf (plot_stream, " \"%s\" %g", labels(k++), tics(i)) + fprintf (plot_stream, " \"%s\" %g", + regexprep (labels(k++), "%", "%%"), tics(i)) if (i < ntics) fputs (plot_stream, ", "); endif @@ -1603,7 +1604,7 @@ k = 1; endif endfor - fputs (plot_stream, ");\n"); + fprintf (plot_stream, ") %s;\n", colorspec); else error ("unsupported type of ticklabel"); endif diff -r ef3fad1f36da -r 66081694ffb8 scripts/plot/pareto.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/plot/pareto.m Thu Nov 29 23:14:08 2007 +0000 @@ -0,0 +1,117 @@ +## Copyright (C) 2007 David Bateman +## Copyright (C) 2003 Alberto Terruzzi +## +## 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} {} pareto (@var{x}) +## @deftypefnx {Function File} {} pareto (@var{x}, @var{y}) +## @deftypefnx {Function File} {} pareto (@var{h}, @dots{}) +## @deftypefnx {Function File} {@var{h} =} pareto (@dots{}) +## Draw a Pareto chart, also called ABC chart. A Pareto chart is a bar graph +## used to arrange information in such a way that priorities for process +## improvement can be established. It organizes and displays information +## to show the relative importance of data. The chart is similar to the +## histogram or bar chart, except that the bars are arranged in decreasing +## order from left to right along the abscissa. +## +## The fundamental idea (Pareto principle) behind the use of Pareto +## diagrams is that the majority of an effect is due to a small subset of the +## causes, so for quality improvement the first few (as presented on the +## diagram) contributing causes to a problem usually account for the majority +## of the result. Thus, targeting these "major causes" for elimination +## results in the most cost-effective improvement scheme. +## +## The data are passed as @var{x} and the abscissa as @var{y}. If @var{y} is +## absent, then the abscissa are assumed to be @code{1 : length (@var{x})}. +## @var{y} can be a string array, a cell array of strings or a numerical +## vector. +## +## An example of the use of @code{pareto} is +## +## @example +## @group +## Cheese = @{"Cheddar", "Swiss", "Camembert", "Munster", "Stilton", ... +## "Blue"@}; +## Sold = [105, 30, 70, 10, 15, 20]; +## pareto(Sold, Cheese); +## @end group +## @end example +## @end deftypefn + +function h = pareto (varargin) + + [ax, varargin, nargin] = __plt_get_axis_arg__ ("pareto", varargin{:}); + + if (nargin != 1 && nargin != 2) + print_usage (); + endif + + x = varargin {1}(:).'; + if (nargin == 2) + y = varargin {2}(:).'; + if (! iscell (y)) + if (ischar (y)) + y = cellstr (y); + else + y = num2cell (y); + endif + endif + else + y = cellfun (@(x) int2str (x), num2cell (1 : numel(x)), + "UniformOutput", false); + endif + + [x, idx] = sort (x, "descend"); + y = y (idx); + cdf = cumsum (x); + maxcdf = cdf(end); + cdf = cdf ./ cdf (end); + [dummy, idx95] = min (abs (cdf - .95)); + idx95 - idx95(1); + + [ax, hbar, hline] = plotyy (ax, 1 : idx95, x (1 : idx95), + 1 : length(cdf), 100 .* cdf, + @bar, @plot); + + axis (ax(1), [1 - 0.6, idx95 + 0.6, 0, maxcdf]); + axis (ax(2), [1 - 0.6, idx95 + 0.6, 0, 100]); + set (ax(2), "ytick", [0, 20, 40, 60, 80, 100], + "yticklabel", {"0%", "20%", "40%", "60%", "80%", "100%"}); + set (ax(1), "xtick", 1 : idx95, "xticklabel", y (1: idx95)); + set (ax(2), "xtick", 1 : idx95, "xticklabel", y (1: idx95)); + + if (nargout > 0) + h = [hbar; hline]; + endif + +endfunction + +%!demo +%! close +%! Cheese = {"Cheddar", "Swiss", "Camembert", "Munster", "Stilton", "Blue"}; +%! Sold = [105, 30, 70, 10, 15, 20]; +%! pareto(Sold, Cheese); + +%!demo +%! close +%! % Suppose that we want establish which products makes 80 % of turnover. +%! Codes = {"AB4","BD7","CF8","CC5","AD11","BB5","BB3","AD8","DF3","DE7"}; +%! Value = [2.35 7.9 2.45 1.1 0.15 13.45 5.4 2.05 0.85 1.65]'; +%! SoldUnits = [54723 41114 16939 1576091 168000 687197 120222 168195, ... +%! 1084118 55576]'; +%! pareto (Value.*SoldUnits, Codes); diff -r ef3fad1f36da -r 66081694ffb8 scripts/plot/plotyy.m --- a/scripts/plot/plotyy.m Thu Nov 29 22:13:29 2007 +0000 +++ b/scripts/plot/plotyy.m Thu Nov 29 23:14:08 2007 +0000 @@ -93,7 +93,8 @@ xlim = [min([x1(:); x2(:)]), max([x1(:); x2(:)])]; h1 = feval (fun1, x1, y1); - set (ax(1), "ycolor", get (h1(1), "color")); + + set (ax(1), "ycolor", getcolor (h1(1))); set (ax(1), "position", get (ax(1), "outerposition")); set (ax(1), "xlim", xlim); @@ -105,7 +106,20 @@ h2 = feval (fun2, x2, y2); set (ax(2), "yaxislocation", "right"); - set (ax(2), "ycolor", get (h2(1), "color")); + set (ax(2), "ycolor", getcolor (h2(1))); set (ax(2), "position", get (ax(1), "outerposition")); set (ax(2), "xlim", xlim); endfunction + +function color = getcolor (ax) + obj = get (ax); + if (isfield (obj, "color")) + color = obj.color; + elseif (isfield (obj, "facecolor") && ! ischar (obj.facecolor)) + color = obj.facecolor; + elseif (isfield (obj, "edgecolor") && ! ischar (obj.edgecolor)) + color = obj.edgecolor; + else + color = [0, 0, 0]; + endif +endfunction