Mercurial > hg > octave-lojdl
changeset 14011:431c6b00653d
scatter.m: Bug fix (34936).
* __scatter__.m: Fix bug 34936. Don't ask gnuplot to render polygons with
vertex color data.
* scatter.m: Add / modify demos.
author | Ben Abbott <bpabbott@mac.com> |
---|---|
date | Wed, 07 Dec 2011 19:58:51 -0500 |
parents | 99e33d556d5c |
children | 4faef552363d |
files | scripts/plot/private/__scatter__.m scripts/plot/scatter.m |
diffstat | 2 files changed, 85 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/plot/private/__scatter__.m +++ b/scripts/plot/private/__scatter__.m @@ -133,6 +133,8 @@ addlistener (hg, "cdata", @update_data); addlistener (hg, "sizedata", @update_data); + one_explicit_color = ischar (c) || isequal (size (c), [1, 3]); + if (numel (x) <= 100) ## For small number of points, we'll construct an object for each point. @@ -141,7 +143,7 @@ s = repmat (s, numel(x), 1); endif - if (ischar (c) || rows(c) == 1) + if (one_explicit_color) for i = 1 : numel (x) if (filled) h = __go_patch__ (hg, "xdata", x(i), "ydata", y(i), "zdata", z(i,:), @@ -160,6 +162,9 @@ endif endfor else + if (rows (c) == 1) + c = ones (rows (x), 1) * c; + endif for i = 1 : numel (x) if (filled) h = __go_patch__ (hg, "xdata", x(i), "ydata", y(i), "zdata", z(i,:), @@ -189,12 +194,12 @@ ## For larger numbers of points, we split the points by common color. vert = [x, y, z]; - - if (ischar (c) || rows (c) == 1) - h = render_size_color (hg, vert, s, c, marker, filled, false); - elseif (columns (c) == 1) + if (one_explicit_color) h = render_size_color (hg, vert, s, c, marker, filled, true); else + if (rows (c) == 1) + c = ones (rows (x), 1) * c; + endif ## We want to group points by colour. So first get all the unique colours [cc, ~, c_to_cc] = unique (c, "rows"); @@ -202,7 +207,6 @@ ## Now for each possible unique colour, get the logical index of ## points that correspond to that colour idx = (i == c_to_cc); - if (isscalar (s)) h = render_size_color (hg, vert(idx, :), s, c(idx,:), marker, filled, true); @@ -231,14 +235,14 @@ addproperty ("marker", hg, "patchmarker", marker); if (filled) addproperty ("markeredgecolor", hg, "patchmarkeredgecolor", "none"); - if (ischar (c) || rows (c) == 1) + if (one_explicit_color) addproperty ("markerfacecolor", hg, "patchmarkerfacecolor", c); else addproperty ("markerfacecolor", hg, "patchmarkerfacecolor", "flat"); endif else addproperty ("markerfacecolor", hg, "patchmarkerfacecolor", "none"); - if (ischar (c) || rows (c) == 1) + if (one_explicit_color) addproperty ("markeredgecolor", hg, "patchmarkeredgecolor", c); else addproperty ("markeredgecolor", hg, "patchmarkeredgecolor", "flat"); @@ -260,21 +264,26 @@ x = vert(:,1); y = vert(:,2); z = vert(:,3:end); - if (ischar (c) || !isflat) + toolkit = get (ancestor (hg, "figure"), "__graphics_toolkit__"); + ## Does gnuplot only support triangles with different vertex colors ? + ## TODO - Verify gnuplot can only support one color. If RGB triplets + ## can be assigned to each vertex, then fix __go_draw_axe__.m + gnuplot_hack = numel (x) > 1 && strcmp (toolkit, "gnuplot"); + if (ischar (c) || ! isflat || gnuplot_hack) if (filled) h = __go_patch__ (hg, "xdata", x, "ydata", y, "zdata", z, "faces", 1:numel(x), "vertices", vert, "facecolor", "none", "edgecolor", "none", "marker", marker, "markeredgecolor", "none", - "markerfacecolor", c, + "markerfacecolor", c(1,:), "markersize", s, "linestyle", "none"); else h = __go_patch__ (hg, "xdata", x, "ydata", y, "zdata", z, "faces", 1:numel(x), "vertices", vert, "facecolor", "none", "edgecolor", "none", "marker", marker, - "markeredgecolor", c, + "markeredgecolor", c(1,:), "markerfacecolor", "none", "markersize", s, "linestyle", "none"); endif
--- a/scripts/plot/scatter.m +++ b/scripts/plot/scatter.m @@ -44,8 +44,7 @@ ## If the argument @code{"filled"} is given then the markers as filled. All ## additional arguments are passed to the underlying patch command. ## -## The optional return value @var{h} is a graphics handle to the hggroup -## object representing the points. +## The optional return value @var{h} provides a handle to the patch object ## ## @example ## @group @@ -83,16 +82,19 @@ %!demo +%! clf %! x = randn (100, 1); %! y = randn (100, 1); %! scatter (x, y, "r"); %!demo +%! clf %! x = randn (100, 1); %! y = randn (100, 1); %! scatter (x, y, [], sqrt (x.^2 + y.^2)); %!demo +%! clf %! rand_10x1_data1 = [0.171577, 0.404796, 0.025469, 0.335309, 0.047814, 0.898480, 0.639599, 0.700247, 0.497798, 0.737940]; %! rand_10x1_data2 = [0.75495, 0.83991, 0.80850, 0.73603, 0.19360, 0.72573, 0.69371, 0.74388, 0.13837, 0.54143]; %! x = rand_10x1_data1; @@ -101,6 +103,7 @@ %! h = scatter (x, y, s, s, "s", "filled"); %!demo +%! clf %! rand_10x1_data3 = [0.42262, 0.51623, 0.65992, 0.14999, 0.68385, 0.55929, 0.52251, 0.92204, 0.19762, 0.93726]; %! rand_10x1_data4 = [0.020207, 0.527193, 0.443472, 0.061683, 0.370277, 0.947349, 0.249591, 0.666304, 0.134247, 0.920356]; %! x = rand_10x1_data3; @@ -109,6 +112,7 @@ %! h = scatter (x, y, [], "r", "s", "filled"); %!demo +%! clf %! rand_10x1_data5 = [0.777753, 0.093848, 0.183162, 0.399499, 0.337997, 0.686724, 0.073906, 0.651808, 0.869273, 0.137949]; %! rand_10x1_data6 = [0.37460, 0.25027, 0.19510, 0.51182, 0.54704, 0.56087, 0.24853, 0.75443, 0.42712, 0.44273]; %! x = rand_10x1_data5; @@ -117,10 +121,63 @@ %! h = scatter (x, y, [], "r", "s"); %!demo -%! n = 500; -%! x = rand (n,1); -%! y = rand (n,1); -%! idx = ceil (rand (n,1)*3); -%! colors = eye(3)(idx, :); -%! scatter (x,y,15, colors, "filled"); +%! k = 1; +%! clf +%! for m = [1, 3] +%! for n = [101, 50, 1] +%! x = rand (n, 1); +%! y = rand (n, 1); +%! if (m > 1) +%! str = "Three Colors"; +%! idx = ceil (rand (n, 1) * 3); +%! colors = eye(3); +%! colors = colors(idx, :); +%! else +%! str = "Random Colors"; +%! colors = rand (n, m); +%! endif +%! if (n == 1) +%! str = sprintf ("%s: 1 point", str); +%! elseif (n < 100) +%! str = sprintf ("%s: < 100 points", str); +%! else +%! str = sprintf ("%s: > 100 points", str); +%! endif +%! subplot (2, 3, k) +%! k = k + 1; +%! scatter (x, y, 15, colors, "filled") +%! axis ([0 1 0 1]) +%! title (str) +%! endfor +%! endfor +%!demo +%! k = 1; +%! clf +%! for m = [1, 3] +%! for n = [101, 50, 1] +%! x = rand (n, 1); +%! y = rand (n, 1); +%! if (m > 1) +%! str = "Three Colors"; +%! idx = ceil (rand (n, 1) * 3); +%! colors = eye(3); +%! colors = colors(idx, :); +%! else +%! str = "Random Colors"; +%! colors = rand (n, m); +%! endif +%! if (n == 1) +%! str = sprintf ("%s: 1 point", str); +%! elseif (n < 100) +%! str = sprintf ("%s: < 100 points", str); +%! else +%! str = sprintf ("%s: > 100 points", str); +%! endif +%! subplot (2, 3, k) +%! k = k + 1; +%! scatter (x, y, 15, colors) +%! axis ([0 1 0 1]) +%! title (str) +%! endfor +%! endfor