changeset 7220:66081694ffb8

[project @ 2007-11-29 23:14:07 by jwe]
author jwe
date Thu, 29 Nov 2007 23:14:08 +0000
parents ef3fad1f36da
children 2636c0846924
files scripts/ChangeLog scripts/plot/Makefile.in scripts/plot/__go_draw_axes__.m scripts/plot/pareto.m scripts/plot/plotyy.m
diffstat 5 files changed, 146 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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  <dbateman@free.fr>
 
+	* 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.
--- 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 \
--- 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
--- /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
+## <http://www.gnu.org/licenses/>.
+
+## -*- 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);
--- 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