Mercurial > hg > octave-nkf
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