# HG changeset patch # User Rik # Date 1456331699 28800 # Node ID fb7f40558553d07aecead44e868ea26250087ead # Parent 1d8e020d86dfe7543979e70f340dfd3290432851 Fix callback routine for updating scatter plots (bug #47237). * __scatter__.m (update_data): Add all construction cases from function scatter to callback routine update_data for case where number of points is <= 100. Emit an error if the number of points is greater than 100 and suggest the alternative of re-invoking scatter with the new data. diff -r 1d8e020d86df -r fb7f40558553 scripts/plot/draw/private/__scatter__.m --- a/scripts/plot/draw/private/__scatter__.m Tue Feb 23 21:58:35 2016 -0500 +++ b/scripts/plot/draw/private/__scatter__.m Wed Feb 24 08:34:59 2016 -0800 @@ -355,34 +355,98 @@ "markerfacecolor", fc, "markeredgecolor", ec); endfunction +## FIXME: This callback routine doesn't handle the case where N > 100. function update_data (h, d) x = get (h, "xdata"); y = get (h, "ydata"); z = get (h, "zdata"); + if (numel (x) > 100) + error ("scatter: cannot update data with more than 100 points. Call scatter (x, y, ...) with new data instead."); + endif c = get (h, "cdata"); - if (rows (c) == 1) - c = repmat (c, numel (x), 1); + one_explicit_color = ischar (c) || isequal (size (c), [1, 3]); + if (! one_explicit_color) + if (rows (c) == 1) + c = repmat (c, numel (x), 1); + endif endif + filled = ! strcmp (get (h, "markerfacecolor"), "none"); s = get (h, "sizedata"); if (numel (s) == 1) s = repmat (s, numel (x), 1); endif hlist = get (h, "children"); - if (isempty (z)) - for i = 1 : length (hlist) - set (hlist(i), "vertices", [x(i), y(i)], - "cdata", reshape (c(i,:),[1, size(c)(2:end)]), - "facevertexcdata", c(i,:), - "markersize", s(i)); - endfor + if (one_explicit_color) + if (filled) + if (isempty (z)) + for i = 1 : length (hlist) + set (hlist(i), "vertices", [x(i), y(i)], + "markersize", s(i), + "markeredgecolor", c, "markerfacecolor", c); + + endfor + else + for i = 1 : length (hlist) + set (hlist(i), "vertices", [x(i), y(i), z(i)], + "markersize", s(i), + "markeredgecolor", c, "markerfacecolor", c); + endfor + endif + else + if (isempty (z)) + for i = 1 : length (hlist) + set (hlist(i), "vertices", [x(i), y(i)], + "markersize", s(i), + "markeredgecolor", c, "markerfacecolor", "none"); + + endfor + else + for i = 1 : length (hlist) + set (hlist(i), "vertices", [x(i), y(i), z(i)], + "markersize", s(i), + "markeredgecolor", c, "markerfacecolor", "none"); + endfor + endif + endif else - for i = 1 : length (hlist) - set (hlist(i), "vertices", [x(i), y(i), z(i)], - "cdata", reshape (cd(i,:),[1, size(cd)(2:end)]), - "facevertexcdata", cd(i,:), - "markersize", s(i)); - endfor + if (filled) + if (isempty (z)) + for i = 1 : length (hlist) + set (hlist(i), "vertices", [x(i), y(i)], + "markersize", s(i), + "markeredgecolor", "none", "markerfacecolor", "flat", + "cdata", reshape (c(i,:),[1, size(c)(2:end)]), + "facevertexcdata", c(i,:)); + endfor + else + for i = 1 : length (hlist) + set (hlist(i), "vertices", [x(i), y(i), z(i)], + "markersize", s(i), + "markeredgecolor", "none", "markerfacecolor", "flat", + "cdata", reshape (c(i,:),[1, size(c)(2:end)]), + "facevertexcdata", c(i,:)); + endfor + endif + else + if (isempty (z)) + for i = 1 : length (hlist) + set (hlist(i), "vertices", [x(i), y(i)], + "markersize", s(i), + "markeredgecolor", "flat", "markerfacecolor", "none", + "cdata", reshape (c(i,:),[1, size(c)(2:end)]), + "facevertexcdata", c(i,:)); + endfor + else + for i = 1 : length (hlist) + set (hlist(i), "vertices", [x(i), y(i), z(i)], + "markersize", s(i), + "markeredgecolor", "flat", "markerfacecolor", "none", + "cdata", reshape (c(i,:),[1, size(c)(2:end)]), + "facevertexcdata", c(i,:)); + endfor + endif + endif endif endfunction