changeset 21330:fb7f40558553

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.
author Rik <rik@octave.org>
date Wed, 24 Feb 2016 08:34:59 -0800
parents 1d8e020d86df
children ca084a8b64c3
files scripts/plot/draw/private/__scatter__.m
diffstat 1 files changed, 79 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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