diff scripts/plot/__area__.m @ 8056:9a6f4713f765

Add area, bar, quiver and stair series graphics objects. Document them
author David Bateman <dbateman@free.fr>
date Tue, 26 Aug 2008 11:58:14 -0400
parents fdb3840cec66
children 3b53b25e2550
line wrap: on
line diff
--- a/scripts/plot/__area__.m
+++ b/scripts/plot/__area__.m
@@ -20,20 +20,99 @@
 
 function retval = __area__ (ax, x, y, bv, varargin)
 
-  colors = [1, 0, 0; 0, 1, 0; 0, 0, 1; 1, 1, 0; 1, 0, 1; 0, 1, 1];
+  y0 = bv * ones (1, rows (y));
+  y0 = zeros (1, rows (y));
+  retval = [];
+  for i = 1: size (y, 2);
+    hg = hggroup ();
+    x1 = x(:, 1).';
+    y1 = y (:, i).';
+    addproperty ("xdata", hg, "data", x1);
+    addproperty ("ydata", hg, "data", y1);
 
-  x = [x(1,:); x; x(end,:)];
-
-  y = cumsum ([[bv, ones(1, size (y, 2) - 1)]; y;
-	       [bv, ones(1, size (y, 2) - 1)]], 2);
+    addlistener (hg, "xdata", @update_data);
+    addlistener (hg, "ydata", @update_data);
 
-  retval = patch (ax, x(:,1), y(:,1), colors(1,:), varargin{:});
+    if (i == 1)
+      h = patch (ax, [x1(1), x1, fliplr(x1)], [bv, y1, bv*ones(1, length(y1))],
+		 __next_line_color__ (), "parent", hg, varargin{:});
+    else
+      y1 = y0 + y1;
+      h = patch (ax, [x1(1), x1, fliplr(x1)], [y0(1), y1, fliplr(y0)],
+		 __next_line_color__ (), "parent", hg, varargin{:});
+    endif
+
+    y0 = y1;
+
+    addproperty ("basevalue", hg, "data", bv);
+    addlistener (hg, "basevalue", @move_baseline); 
 
-  for i = 2:size(y,2)
-    tmp = patch (ax, [x(:,i); flipud(x(:,i))],
-		 [y(:,i) ; flipud(y(:, i-1))], colors(i,:), varargin{:});
+    addproperty ("edgecolor", hg, "patchedgecolor", get (h, "edgecolor"));
+    addproperty ("linewidth", hg, "patchlinewidth", get (h, "linewidth"));
+    addproperty ("linestyle", hg, "patchlinestyle", get (h, "linestyle"));
+    addproperty ("facecolor", hg, "patchfacecolor", get (h, "facecolor"));
 
-    retval = [retval; tmp];
+    addlistener (hg, "edgecolor", @update_props);
+    addlistener (hg, "linewidth", @update_props); 
+    addlistener (hg, "linestyle", @update_props); 
+    addlistener (hg, "facecolor", @update_props); 
+
+    retval = [retval; hg];
+    addproperty ("areagroup", hg, "data");
+    set (retval, "areagroup", retval);
   endfor
 
 endfunction
+
+function update_props (h, d)
+  kids = get (h, "children");
+  set (kids, "edgecolor", get (h, "edgecolor"), 
+       "linewidth", get (h, "linewidth"),
+       "linestyle", get (h, "linestyle"),
+       "facecolor", get (h, "facecolor"));
+endfunction
+
+function move_baseline (h, d)
+  persistent recursion = false;
+
+  ## Don't allow recursion
+  if (! recursion)
+    unwind_protect
+      recursion = true;
+      hlist = get (h, "areagroup");
+      b0 = get (h, "basevalue");
+
+      for hh = hlist(:)'
+	if (hh != h )
+	  b1 = get (hh, "basevalue");
+	  if (b1 != b0)
+	    set (hh, "basevalue", b0);
+	  endif
+	endif
+      endfor
+      update_data (h, d);
+    unwind_protect_cleanup
+      recursion = false;
+    end_unwind_protect
+  endif
+endfunction
+
+function update_data (h, d)
+  hlist = get (h, "areagroup");
+  bv = get (h, "basevalue");
+  for i = 1 : length (hlist)
+    hh = hlist(i);
+    x1 = get (hh, "xdata")(:);
+    y1 = get (hh, "ydata")(:);
+
+    set (get (hh, "children"), "xdata", [x1(1); x1; flipud(x1)]);
+    if (i == 1)
+      set (get (hh, "children"), "ydata", [bv; y1; bv*ones(length(y1), 1)]);
+    else
+      y1 = y0 + y1;
+      set (get (hh, "children"), "ydata", [y0(1); y1; flipud(y0)]);
+    endif      
+
+    y0 = y1;
+  endfor
+endfunction