# HG changeset patch # User Pantxo Diribarne # Date 1392470050 -3600 # Node ID 2d0afa04d10354a0e0b66ac421032518d1b48022 # Parent 00ba456b9aa82f4e8e189310b3e2af82c940c10e Make stemseries share the same baseline (bug #41593). * __stem__.m: Create only one baseline line object. Move baseline addlistener after the main loop. Move setting prop/val after the main loop. Add an argument to show_baseline in order to manage "visibility" hg property. * __stem__.m (move_baseline): update the line "basevalue" property. * stem.m: Add %!test for new behavior. diff -r 00ba456b9aa8 -r 2d0afa04d103 scripts/plot/draw/private/__stem__.m --- a/scripts/plot/draw/private/__stem__.m Thu Feb 13 22:29:44 2014 -0500 +++ b/scripts/plot/draw/private/__stem__.m Sat Feb 15 14:14:10 2014 +0100 @@ -48,6 +48,8 @@ h = []; nx = rows (x); + h_baseline = []; + for i = 1 : columns (x) if (have_z) xt = x(:)'; @@ -90,19 +92,19 @@ __line__ (hax, xt, yt, zt, "color", lc, "linestyle", ls, "parent", hg); __line__ (hax, x, y, z, "color", mc, "linestyle", "none", "marker", ms, "markerfacecolor", fc, "parent", hg); - h_baseline = []; else __line__ (hax, xt, yt, "color", lc, "linestyle", ls, "parent", hg); __line__ (hax, x(:,i), y(:, i), "color", mc, "linestyle", "none", "marker", ms, "markerfacecolor", fc, "parent", hg); + x_axis_range = get (hax, "xlim"); - h_baseline = line (hax, x_axis_range, [0, 0], "color", [0, 0, 0]); - set (h_baseline, "handlevisibility", "off", "xliminclude", "off"); - addlistener (hax, "xlim", @update_xlim); - addproperty ("basevalue", h_baseline, "data", 0); - addlistener (h_baseline, "basevalue", {@update_baseline, 0}); - addlistener (h_baseline, "ydata", {@update_baseline, 1}); - addlistener (h_baseline, "visible", {@update_baseline, 2}); + if (isempty (h_baseline)) + h_baseline = line (hax, x_axis_range, [0, 0], "color", [0, 0, 0]); + set (h_baseline, "handlevisibility", "off", "xliminclude", "off"); + addproperty ("basevalue", h_baseline, "data", 0); + else + set (h_baseline, "xdata", x_axis_range); + endif endif ## Setup the hggroup and listeners. @@ -110,11 +112,6 @@ addproperty ("baseline", hg, "data", h_baseline); addproperty ("basevalue", hg, "data", 0); - if (! have_z) - addlistener (hg, "showbaseline", @show_baseline); - addlistener (hg, "basevalue", @move_baseline); - endif - addproperty ("color", hg, "linecolor", lc); addproperty ("linestyle", hg, "linelinestyle", ls); addproperty ("linewidth", hg, "linelinewidth", 0.5); @@ -146,14 +143,28 @@ ## Matlab property, although Octave does not implement it. addproperty ("hittestarea", hg, "radio", "on|{off}", "off"); - if (! isempty (args)) - set (hg, args{:}); - endif - if (i == 1 && ! isempty (h_baseline)) - set (h_baseline, "parent", get (hg, "parent")); - endif endfor + ## baseline listeners + if (! isempty (h_baseline)) + addlistener (hax, "xlim", @update_xlim); + for hg = h' + addlistener (hg, "showbaseline", @show_baseline); + addlistener (hg, "visible", {@show_baseline, h}); + addlistener (hg, "basevalue", @move_baseline); + endfor + + addlistener (h_baseline, "basevalue", {@update_baseline, 0}); + addlistener (h_baseline, "ydata", {@update_baseline, 1}); + addlistener (h_baseline, "visible", {@update_baseline, 2}); + set (h_baseline, "parent", get (hg(1), "parent")); + endif + + ## property/value pairs + if (! isempty (args)) + set (h, args{:}); + endif + if (! strcmp (hold_state, "add") && have_z) set (hax, "view", [-37.5 30], "xgrid", "on", "ygrid", "on", "zgrid", "on"); @@ -365,8 +376,16 @@ endfor endfunction -function show_baseline (h, ~) - set (get (h, "baseline"), "visible", get (h, "showbaseline")); +function show_baseline (h, ~, hg = []) + if (isempty (hg)) + set (get (h, "baseline"), "visible", get (h, "showbaseline")); + else + if (all (strcmp (get (hg, "visible"), "off"))) + set (get (h, "baseline"), "visible", "off"); + else + set (get (h, "baseline"), "visible", "on"); + endif + endif endfunction function move_baseline (h, ~) @@ -374,6 +393,7 @@ bl = get (h, "baseline"); set (bl, "ydata", [b0, b0]); + set (bl, "basevalue", b0); kids = get (h, "children"); yt = get (h, "ydata")(:)'; diff -r 00ba456b9aa8 -r 2d0afa04d103 scripts/plot/draw/stem.m --- a/scripts/plot/draw/stem.m Thu Feb 13 22:29:44 2014 -0500 +++ b/scripts/plot/draw/stem.m Sat Feb 15 14:14:10 2014 +0100 @@ -187,7 +187,7 @@ %! y = [sin(x), cos(x)]; %! h = stem (x, y); %! set (h(2), 'color', 'g'); -%! set (h(1), 'basevalue', -1); +%! set (h(1), 'basevalue', -0.75); %! title ('stem plots modified through hggroup handle'); %!demo @@ -213,3 +213,18 @@ %!error stem (ones (2,2), ones (3,3)) %!error stem (1, "FOO") +%!test +%! ## stemseries share the same baseline and basevalue +%! hf = figure ("visible", "off"); +%! unwind_protect +%! h = stem ([1 2; 1.5 2.5], [1 1;2 2]); +%! assert (get (h(1), "baseline"), get (h(2), "baseline")) +%! bv = 0.3; +%! set (h(1), "basevalue", bv) +%! assert (get (get (h(1), "baseline"), "basevalue"), bv) +%! assert (get (h(1), "basevalue"), bv) +%! assert (get (h(2), "basevalue"), bv) +%! unwind_protect_cleanup +%! close (hf); +%! end_unwind_protect +