Mercurial > octave
diff scripts/plot/__bar__.m @ 7189:e8d953d03f6a
[project @ 2007-11-26 20:42:09 by dbateman]
author | dbateman |
---|---|
date | Mon, 26 Nov 2007 20:42:11 +0000 |
parents | 735086cfd405 |
children | b48a21816f2e |
line wrap: on
line diff
--- a/scripts/plot/__bar__.m Mon Nov 26 20:31:25 2007 +0000 +++ b/scripts/plot/__bar__.m Mon Nov 26 20:42:11 2007 +0000 @@ -22,15 +22,36 @@ function varargout = __bar__ (vertical, func, varargin) + varargout = cell (nargout, 1); + if (isscalar (varargin{1}) && ishandle (varargin{1})) + h = varargin{1}; + if (! strcmp (get (h, "type"), "axes")) + error ("%s: expecting first argument to be an axes object", func); + endif + oldh = gca (); + unwind_protect + axes (h); + [varargout{:}] = __bar2__ (h, vertical, func, varargin{2:end}); + unwind_protect_cleanup + axes (oldh); + end_unwind_protect + else + [varargout{:}] = __bar2__ (gca(), vertical, func, varargin{:}); + endif + +endfunction + +function varargout = __bar2__ (h, vertical, func, varargin) + ## Slightly smaller than 0.8 to avoid clipping issue in gnuplot 4.0 width = 0.8 - 10 * eps; group = true; - if (nargin < 3) + if (nargin < 4) print_usage (); endif - if (nargin > 3 && isnumeric (varargin{2})) + if (nargin > 4 && isnumeric (varargin{2})) x = varargin{1}; if (isvector (x)) x = x(:); @@ -63,7 +84,7 @@ newargs = {}; have_line_spec = false; - while (idx <= nargin -2) + while (idx <= nargin - 3) if (isstr (varargin{idx}) && strcmp (varargin{idx}, "grouped")) group = true; idx++; @@ -83,7 +104,7 @@ endif if (isscalar(varargin{idx})) width = varargin{idx++}; - elseif (idx == nargin - 2) + elseif (idx == nargin - 3) newargs = [newargs,varargin(idx++)]; else newargs = [newargs,varargin(idx:idx+1)]; @@ -107,9 +128,8 @@ width = width / ycols; endif - cutoff = (x(1:end-1) + x(2:end)) / 2; - delta_p = [(cutoff - x(1:end-1)); (x(end) - cutoff(end))] * width; - delta_m = [(cutoff(1) - x(1)); (x(2:end) - cutoff)] * width; + cutoff = min (diff (double(x))) / 2; + delta_p = delta_m = repmat (cutoff * width, size (x)); x1 = (x - delta_m)(:)'; x2 = (x + delta_p)(:)'; xb = repmat ([x1; x1; x2; x2](:), 1, ycols); @@ -137,43 +157,19 @@ xb = reshape (xb, [4, numel(xb) / 4 / ycols, ycols]); yb = reshape (yb, [4, numel(yb) / 4 / ycols, ycols]); - color = [1, 0, 0; 0, 1, 0; 0, 0, 1; 1, 1, 0; 1, 0, 1; 0, 1, 1]; - if (vertical) - if (nargout < 2) - newplot (); - tmp = []; - for i = 1 : ycols - if (! have_line_spec) - tmp = [tmp; patch(xb(:,:,i), yb(:,:,i), color(i,:), newargs {:})]; - else - tmp = [tmp; patch(xb(:,:,i), yb(:,:,i), newargs {:})]; - endif - endfor - if (nargout == 1) - varargout{1} = tmp; - endif - else + if (nargout < 2) + newplot (); + tmp = __bars__ (h, vertical, x, y, xb, yb, width, group, have_line_spec, newargs {:}); + if (nargout == 1) + varargout{1} = tmp; + endif + else + if (vertical) varargout{1} = xb; varargout{2} = yb; - endif - else - if (nargout < 2) - newplot (); - tmp = []; - for i = 1 : ycols - if (! have_line_spec) - tmp = [tmp; patch(yb(:,:,i), xb(:,:,i), color(i,:), newargs {:})]; - else - tmp = [tmp; patch(yb(:,:,i), xb(:,:,i), newargs {:})]; - endif - endfor - if (nargout == 1) - varargout{1} = tmp; - endif else varargout{1} = yb; varargout{2} = xb; endif endif - endfunction