Mercurial > hg > octave-avbm
changeset 6885:987a7bf45c99
[project @ 2007-09-10 20:51:09 by jwe]
author | jwe |
---|---|
date | Mon, 10 Sep 2007 20:51:09 +0000 |
parents | 1cbb8b606d63 |
children | 1c1d62569590 |
files | scripts/ChangeLog scripts/plot/__bar__.m scripts/plot/__go_draw_axes__.m scripts/plot/__patch__.m |
diffstat | 4 files changed, 225 insertions(+), 124 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,11 @@ +2007-09-10 David Bateman <dbateman@free.fr> + + * plot/__go_draw_axes__.m: Allow gnuplot 4.0 with patches, but + limit the selection of colors in the same way as for lines. + * plot/__patch__.m: Allow matrix arguments with one patch per + column. + * plot/__bar__.m: Adapt to use "patch". + 2007-09-06 John W. Eaton <jwe@octave.org> * plot/drawnow.m (drawnow): New arg, debug_file.
--- a/scripts/plot/__bar__.m +++ b/scripts/plot/__bar__.m @@ -75,10 +75,11 @@ idx++; else if ((isstr(varargin{idx}) || iscell(varargin{idx})) && !HaveLineSpec) - [dummy, valid] = __pltopt__ (func, varargin{idx}, false); + [linespec, valid] = __pltopt__ (func, varargin{idx}, false); if (valid) HaveLineSpec = true; - newargs = [newargs,varargin(idx++)]; + newargs = [{linespec.color}, newargs]; + idx++; continue; endif endif @@ -113,16 +114,15 @@ delta_m = [(cutoff(1) - x(1)); (x(2:end) - cutoff)] * width; x1 = (x - delta_m)(:)'; x2 = (x + delta_p)(:)'; - xb = repmat([x1; x1; x2; x2; NaN * ones(1,ylen)](:), 1, ycols); + xb = repmat([x1; x1; x2; x2](:), 1, ycols); if (group) width = width / ycols; offset = ((delta_p + delta_m) * [-(ycols - 1) / 2 : (ycols - 1) / 2]); - xb(1:5:5*ylen,:) += offset; - xb(2:5:5*ylen,:) += offset; - xb(3:5:5*ylen,:) += offset; - xb(4:5:5*ylen,:) += offset; - xb(5:5:5*ylen,:) += offset; + xb(1:4:4*ylen,:) += offset; + xb(2:4:4*ylen,:) += offset; + xb(3:4:4*ylen,:) += offset; + xb(4:4:4*ylen,:) += offset; y0 = zeros (size (y)); y1 = y; else @@ -130,27 +130,35 @@ y0 = [zeros(ylen,1), y1(:,1:end-1)]; endif - yb = zeros (5*ylen, ycols); - yb(1:5:5*ylen,:) = y0; - yb(2:5:5*ylen,:) = y1; - yb(3:5:5*ylen,:) = y1; - yb(4:5:5*ylen,:) = y0; - yb(5:5:5*ylen,:) = NaN; + yb = zeros (4*ylen, ycols); + yb(1:4:4*ylen,:) = y0; + yb(2:4:4*ylen,:) = y1; + yb(3:4:4*ylen,:) = y1; + yb(4:4:4*ylen,:) = y0; + + xb = reshape (xb, 4, numel (xb) / 4); + yb = reshape (yb, 4, numel (yb) / 4); + + if (! HaveLineSpec) + colors = [1, 0, 0; 0, 1, 0; 0, 0, 1; 1, 1, 0; 1, 0, 1; 0, 1, 1]; + newargs = [{shiftdim(colors (mod (floor ([0 : (ycols * ylen - 1)] / ylen), + 6) + 1, :), -1)}, newargs]; + endif if (vertical) if (nargout < 1) - plot (xb, yb, newargs{:}); + patch (xb, yb, newargs {:}); elseif (nargout < 2) - varargout{1} = plot (xb, yb, newargs{:}); + varargout{1} = patch (xb, yb, newargs {:}); else varargout{1} = xb; varargout{2} = yb; endif else if (nargout < 1) - plot (yb, xb, newargs{:}); + patch (yb, xb, newargs{:}); elseif (nargout < 2) - varargout{1} = plot (yb, xb, newargs{:}); + varargout{1} = patch (yb, xb, newargs{:}); else varargout{1} = yb; varargout{2} = xb;
--- a/scripts/plot/__go_draw_axes__.m +++ b/scripts/plot/__go_draw_axes__.m @@ -427,53 +427,72 @@ endif case "patch" - if (! have_newer_gnuplot) - warning ("patch objects require gnuplot v4.2 or later!, sorry") + if (! isempty (obj.zdata)) + warning ("gnuplot (as of v4.2) supports only 2D patches, ignoring z values") + endif + nd = 2; + cmap = parent_figure_obj.colormap; + clim = axis_obj.clim; + data_idx++; + is_image_data(data_idx) = false; + parametric(data_idx) = false; + titlespec{data_idx} = "title \"\""; + usingclause{data_idx} = ""; + if (isfield (obj, "facecolor") && isfield (obj, "cdata")) + if (strncmp (obj.facecolor, "none", 4)) + color = [1, 1, 1]; + elseif (strncmp (obj.facecolor, "flat", 4)) + r = 1 + round ((size (cmap, 1) - 1) * (obj.cdata - clim(1))/(clim(2) - clim(1))); + r = max (1, min (r, size (cmap, 1))); + color = cmap(r,:); + elseif (strncmp (obj.facecolor, "interp", 6)) + warning ("\"interp\" not supported, using 1st entry of cdata") + r = 1 + round ((size (cmap, 1) - 1) * obj.cdata(1)); + r = max (1, min (r, size (cmap, 1))); + color = cmap(r,:); + else + color = obj.facecolor; + endif else - if (! isempty (obj.zdata)) - warning ("gnuplot (as of v4.2) supports only 2D patches, ignoring z values") + color = [1, 0, 0]; + endif + + if (have_newer_gnuplot) + withclause{data_idx} = sprintf ("with filledcurve lc rgb \"#%02x%02x%02x\"",round (255*color)); + else + if (isequal (color, [0,0,0])) + typ = -1; + elseif (isequal (color, [1,0,0])) + typ = 1; + elseif (isequal (color, [0,1,0])) + typ = 2; + elseif (isequal (color, [0,0,1])) + typ = 3; + elseif (isequal (color, [1,0,1])) + typ = 4; + elseif (isequal (color, [0,1,1])) + typ = 5; + elseif (isequal (color, [1,1,1])) + typ = -1; + elseif (isequal (color, [1,1,0])) + typ = 7; + else + typ = -1; endif - nd = 2; - cmap = parent_figure_obj.colormap; - clim = axis_obj.clim; - data_idx++; - is_image_data(data_idx) = false; - parametric(data_idx) = false; - titlespec{data_idx} = "title \"\""; - usingclause{data_idx} = ""; - if (isfield (obj, "facecolor") && isfield (obj, "cdata")) - if (strncmp (obj.facecolor, "none", 4)) - color = [1, 1, 1]; - elseif (strncmp (obj.facecolor, "flat", 4)) - r = 1 + round ((size (cmap, 1) - 1) * (obj.cdata - clim(1))/(clim(2) - clim(1))); - r = max (1, min (r, size (cmap, 1))); - color = cmap(r,:); - elseif (strncmp (obj.facecolor, "interp", 6)) - warning ("\"interp\" not supported, using 1st entry of cdata") - r = 1 + round ((size (cmap, 1) - 1) * obj.cdata(1)); - r = max (1, min (r, size (cmap, 1))); - color = cmap(r,:); - else - color = obj.facecolor; - endif - else - color = [1, 0, 0]; - endif + withclause{data_idx} = sprintf ("with filledcurve lt %d", typ); + endif + + xdat = obj.xdata(:); + ydat = obj.ydata(:); - withclause{data_idx} = sprintf ("with filledcurve lc rgb \"#%02x%02x%02x\"",round (255*color)); - - xdat = obj.xdata(:); - ydat = obj.ydata(:); - - if (xautoscale) - [xmin, xmax, xminp] = get_data_limits (xmin, xmax, xminp, xdat); - endif - if (yautoscale) - [ymin, ymax, yminp] = get_data_limits (ymin, ymax, yminp, ydat); - endif - data{data_idx} = [xdat, ydat]'; - usingclause{data_idx} = "using ($1):($2)"; + if (xautoscale) + [xmin, xmax, xminp] = get_data_limits (xmin, xmax, xminp, xdat); endif + if (yautoscale) + [ymin, ymax, yminp] = get_data_limits (ymin, ymax, yminp, ydat); + endif + data{data_idx} = [xdat, ydat]'; + usingclause{data_idx} = "using ($1):($2)"; ## patch outline data_idx++; @@ -496,7 +515,30 @@ else color = [0, 0, 0]; endif - withclause{data_idx} = sprintf ("with lines lc rgb \"#%02x%02x%02x\"",round (255*color)); + if (have_newer_gnuplot) + withclause{data_idx} = sprintf ("with lines lc rgb \"#%02x%02x%02x\"",round (255*color)); + else + if (isequal (color, [0,0,0])) + typ = -1; + elseif (isequal (color, [1,0,0])) + typ = 1; + elseif (isequal (color, [0,1,0])) + typ = 2; + elseif (isequal (color, [0,0,1])) + typ = 3; + elseif (isequal (color, [1,0,1])) + typ = 4; + elseif (isequal (color, [0,1,1])) + typ = 5; + elseif (isequal (color, [1,1,1])) + typ = -1; + elseif (isequal (color, [1,1,0])) + typ = 7; + else + typ = -1; + endif + withclause{data_idx} = sprintf ("with lines lt %d", typ); + endif xdat = [xdat; xdat(1)]; ydat = [ydat; ydat(1)];
--- a/scripts/plot/__patch__.m +++ b/scripts/plot/__patch__.m @@ -27,77 +27,120 @@ function h = __patch__ (p, varargin) - if (nargin < 1) + if (nargin < 3) + print_usage (); + endif + + iarg = 1; + have_x = have_z = have_c = false; + if (isnumeric (varargin {1})) + if (!isnumeric (varargin {2})) + print_usage (); + endif + + x = varargin {1}; + y = varargin {2}; + have_x = true; + iarg += 2; + + if (nargin > 3 && ndims (varargin {3}) == 2 && + size (varargin {3}) == size (x)) + z = varargin {3}; + have_z = true; + iarg ++; + endif + endif + + if (have_x && nargin > iarg && isnumeric (varargin {iarg})) + c = varargin {iarg}; + have_c = true; + iarg ++; + + if (ndims (c) == 3 && size (c, 2) == 1) + c = permute (c, [1, 3, 2]); + endif + endif + + if (rem (nargin - iarg, 2) != 0) print_usage (); endif - nvargs = numel (varargin); - - if (nvargs > 1 && isnumeric (varargin{1}) && isnumeric (varargin{2})) - num_data_args = 2; - else - num_data_args = 0; - endif + if (have_x) + if (isvector (x)) + x = x(:); + y = y(:); + if (have_z) + z = z(:); + endif + endif - if (rem (nvargs - num_data_args - 1, 2) == 0 && nvargs > 2) - else - print_usage ("patch"); - endif - - x = varargin{1}; - y = varargin{2}; - c = varargin{3}; + [nr, nc] = size (x); - h = __go_patch__ (p); - ax = get (h, "parent"); - if (num_data_args > 1) - set (h, "xdata", x, "ydata", y); - endif + for i = 1 : nc + h = __go_patch__ (p); + ax = get (h, "parent"); + if (have_x) + set (h, "xdata", x (:, i), "ydata", y (:, i)); + if (have_z) + set (h, "zdata", z (:, i)); + endif + endif - if (isstr (c)) - ## Have color string. - set (h, "FaceColor", c); - elseif (length (c) == 1) - if (isnan (c)) - set (h, "FaceColor", [1, 1, 1]); - set (h, "CData", c); - elseif (isnumeric (c)) - ## Have color index. - set (h, "FaceColor", "flat"); - set (h, "CData", c); + if (have_c) + if (ndims (c) == 2 && ((nr > 3 && size (c, 2) == nc) || + (size (c, 1) > 1 && size (c, 2) == nc))) + c2 = c (:, i); + elseif (ndims (c) == 3) + c2 = permute (c (:, i, :), [1, 3, 2]); + else + c2 = c; + endif - clim = get(ax, "CLim"); - if (c < clim(1)) - set (ax, "CLim", [c, clim(2)]) + if (numel (c2) == 1) + if (isnan (c)) + set (h, "FaceColor", [1, 1, 1]); + set (h, "CData", c2); + elseif (isnumeric (c2)) + ## Have color index. + set (h, "FaceColor", "flat"); + set (h, "CData", c2); + clim = get(ax, "CLim"); + if (c2 < clim(1)) + set (ax, "CLim", [c2, clim(2)]) + endif + if (c2 > clim(2)) + set (ax, "CLim", [clim(1), c2]) + endif + else + ## Unknown color value. + error ("color value not valid"); + endif + elseif (numel (c2) == 3) + ## Have rgb/rgba value. + set (h, "FaceColor", c2); + else + ## Color vector. + if (length (c2) != length (x) || length (c2) != length (y)) + error ("size of x, y, and c must be equal") + else + set (h, "FaceColor", "interp"); + set(h, "CData", c2); + if (abs(max(c2) - min(c2)) < eps) + set (ax, "CLim", [c2(1)-1, c2(1)+1]) + else + set (ax, "CLim", [min(c2), max(c2)]); + endif + endif + endif + else + set (h, "FaceColor", [0, 1, 0]); endif - if (c > clim(2)) - set (ax, "CLim", [clim(1), c]) - end - else - ## Unknown color value. - error ("color value not valid"); - end - elseif (length (c) == 3) - ## Have rgb/rgba value. - set (h, "FaceColor", c); + if (nargin > iarg + 1) + set (h, varargin{iarg:end}); + endif + endfor else - ## Color vector. - if (length (c) != length (x) || length (c) != length (y)) - error ("size of x, y, and c must be equal") - else - set (h, "FaceColor", "interp"); - set(h, "CData", c); - if (abs(max(c) - min(c)) < eps) - set (ax, "CLim", [c(1)-1, c(1)+1]) - else - set (ax, "CLim", [min(c), max(c)]); - end - end - end - - if (nvargs > num_data_args + 1) - set (h, varargin{num_data_args+2:end}); + error ("Not supported"); endif - endfunction