# HG changeset patch # User Ben Abbott # Date 1318109655 14400 # Node ID e9f6a6edec428f36ae2282698cfb76b8115023cf # Parent 86d18a3cc911b9a1306c79791b2f715602b90f89 Improvements to patch() and fix for bugs reported in #34417. * scripts/plot/patch.m: Add demos. * scripts/plot/private/__patch__.m: Improvements to input parsing. * scripts/plot/__go_draw_axes__.m: Accommodate patches with one scalar color per vertex. diff -r 86d18a3cc911 -r e9f6a6edec42 scripts/plot/patch.m --- a/scripts/plot/patch.m Sat Oct 08 12:37:34 2011 -0700 +++ b/scripts/plot/patch.m Sat Oct 08 17:34:15 2011 -0400 @@ -152,6 +152,56 @@ %! 'FaceVertexCData', jet(5), 'FaceColor', 'interp') %! view (-37.5, 30) +%!demo +%! clf +%! colormap (jet) +%! x = [0 1 1 0]; +%! y = [0 0 1 1]; +%! subplot (2, 1, 1) +%! title ("Blue, Light-Green, and Red Horizontal Bars") +%! patch (x, y + 0, 1); +%! patch (x, y + 1, 2); +%! patch (x, y + 2, 3); +%! subplot (2, 1, 2) +%! title ("Blue, Light-Green, and Red Vertical Bars") +%! patch (x + 0, y, 1 * ones (size (x))); +%! patch (x + 1, y, 2 * ones (size (x))); +%! patch (x + 2, y, 3 * ones (size (x))); + +%!demo +%! clf +%! colormap (jet) +%! x = [0 1 1 0]; +%! y = [0 0 1 1]; +%! subplot (2, 1, 1) +%! title ("Blue horizontal bars: Dark to Light") +%! patch (x, y + 0, 1, "cdatamapping", "direct"); +%! patch (x, y + 1, 9, "cdatamapping", "direct"); +%! patch (x, y + 2, 17, "cdatamapping", "direct"); +%! subplot (2, 1, 2) +%! title ("Blue vertical bars: Dark to Light") +%! patch (x + 0, y, 1 * ones (size (x)), "cdatamapping", "direct"); +%! patch (x + 1, y, 9 * ones (size (x)), "cdatamapping", "direct"); +%! patch (x + 2, y, 17 * ones (size (x)), "cdatamapping", "direct"); + +%!demo +%! clf; +%! colormap (jet); +%! x = [ 0 0; 1 1; 1 0 ]; +%! y = [ 0 0; 0 1; 1 1 ]; +%! p = patch (x, y, "facecolor", "b"); +%! title ("Two blue triangles") +%! set (p, "cdatamapping", "direct", "facecolor", "flat", "cdata", [1 32]) +%! title ("Direct mapping of colors: Light-Green UL and Blue LR triangles") + +%!demo +%! clf; +%! colormap (jet); +%! x = [ 0 0; 1 1; 1 0 ]; +%! y = [ 0 0; 0 1; 1 1 ]; +%! p = patch (x, y, [1 32]); +%! title ("Autoscaling of colors: Red UL and Blue LR triangles") + %!test %! hf = figure ("visible", "off"); %! unwind_protect @@ -183,4 +233,4 @@ %! assert (get (gca, "clim"), [c, 2 * c]); %! unwind_protect_cleanup %! close (hf); -%! end_unwind_protect \ No newline at end of file +%! end_unwind_protect diff -r 86d18a3cc911 -r e9f6a6edec42 scripts/plot/private/__go_draw_axes__.m --- a/scripts/plot/private/__go_draw_axes__.m Sat Oct 08 12:37:34 2011 -0700 +++ b/scripts/plot/private/__go_draw_axes__.m Sat Oct 08 17:34:15 2011 -0400 @@ -699,8 +699,12 @@ elseif (nd == 3 && numel (xcol) == 3) ccdat = ccol * ones (3,1); else - r = 1 + round ((size (cmap, 1) - 1) - * (ccol - clim(1))/(clim(2) - clim(1))); + if (cdatadirect) + r = round (ccol); + else + r = 1 + round ((size (cmap, 1) - 1) + * (ccol - clim(1))/(clim(2) - clim(1))); + endif r = max (1, min (r, size (cmap, 1))); color = cmap(r, :); endif @@ -716,10 +720,17 @@ ccdat = ccdat(:); endif else - warning ("\"interp\" not supported, using 1st entry of cdata"); - r = 1 + round ((size (cmap, 1) - 1) * ccol(1)); + if (sum (diff (ccol))) + warning ("\"interp\" not supported, using 1st entry of cdata"); + endif + if (cdatadirect) + r = round (ccol); + else + r = 1 + round ((size (cmap, 1) - 1) + * (ccol - clim(1))/(clim(2) - clim(1))); + endif r = max (1, min (r, size (cmap, 1))); - color = cmap(r,:); + color = cmap(r(1),:); endif endif elseif (isnumeric (obj.facecolor)) diff -r 86d18a3cc911 -r e9f6a6edec42 scripts/plot/private/__patch__.m --- a/scripts/plot/private/__patch__.m Sat Oct 08 12:37:34 2011 -0700 +++ b/scripts/plot/private/__patch__.m Sat Oct 08 17:34:15 2011 -0400 @@ -31,6 +31,8 @@ failed = false; + is_numeric_arg = cellfun (@isnumeric, varargin); + if (isempty (varargin)) args = {"xdata", [0; 1; 1], "ydata", [0; 0; 1], "facecolor", "blue"}; args = setvertexdata (args); @@ -51,26 +53,47 @@ else failed = true; endif - elseif (isnumeric (varargin{1})) - if (nargin < 3 || ! isnumeric (varargin{2})) + elseif (is_numeric_arg(1)) + if (nargin < 3 || ! is_numeric_arg(2)) failed = true; else - x = varargin{1}; - y = varargin{2}; - iarg = 3; - if (nargin > 3 && ndims (varargin{3}) == 2 && ndims (x) == 2 - && size_equal(x, varargin{3}) && !ischar(varargin{3})) + if (nargin > 4 && all (is_numeric_arg(1:4))) + x = varargin{1}; + y = varargin{2}; z = varargin{3}; - iarg++; - else + c = varargin{4}; + iarg = 5; + elseif (nargin > 3 && all (is_numeric_arg(1:3))) + x = varargin{1}; + y = varargin{2}; z = []; + c = varargin{3}; + iarg = 4; + elseif (nargin > 2 && all (is_numeric_arg(1:2))) + x = varargin{1}; + y = varargin{2}; + z = []; + iarg = 3; + if (rem (nargin - iarg, 2) == 1) + c = varargin {iarg}; + iarg++; + else + c = []; + endif endif if (isvector (x)) x = x(:); y = y(:); z = z(:); + if (isnumeric (c)) + if (isvector (c) && numel (c) == numel (x)) + c = c(:); + elseif (size (c, 1) != numel (x) && size (c, 2) == numel (x)) + c = c.'; + endif + endif endif args{1} = "xdata"; args{2} = x; @@ -79,9 +102,7 @@ args{5} = "zdata"; args{6} = z; - if (isnumeric (varargin{iarg})) - c = varargin{iarg}; - iarg++; + if (isnumeric (c)) if (ndims (c) == 3 && size (c, 2) == 1) c = permute (c, [1, 3, 2]); @@ -108,23 +129,31 @@ args{10} = c; else ## Color Vectors - if (rows (c) != rows (x) || rows (c) != length (y)) - error ("patch: size of x, y, and c must be equal"); - else + if (isempty (c)) args{7} = "facecolor"; args{8} = "interp"; args{9} = "cdata"; args{10} = []; + else + if (rows (c) != rows (x) || rows (c) != length (y)) + error ("patch: size of x, y, and c must be equal"); + elseif (rows (c) == rows (x) && rows (c) == rows (y)) + args{7} = "facecolor"; + args{8} = "interp"; + args{9} = "cdata"; + args{10} = c; + else + error ("patch: color value not valid"); + endif endif endif - elseif (ischar (varargin{iarg}) && rem (nargin - iarg, 2) != 0) + elseif (ischar (c) && rem (nargin - iarg, 2) == 0) ## Assume that any additional argument over an even number is ## color string. args{7} = "facecolor"; - args{8} = tolower (varargin{iarg}); + args{8} = tolower (c); args{9} = "cdata"; args{10} = []; - iarg++; else args{7} = "facecolor"; args{8} = [0, 1, 0]; @@ -288,6 +317,8 @@ if (ndims (c) == 3) fvc = reshape (c, size (c, 1) * size (c, 2), size(c, 3)); + elseif (isvector (c)) + fvc = c(:); else fvc = c.'; endif