From graphics-request at octave dot org Mon Jan 24 05:38:31 2005 Subject: patch to plot all data at once without "hold on" if possible From: Daniel J Sebald To: octave maintainers mailing list , graphics@octave.org Date: Mon, 24 Jan 2005 05:43:34 -0600 This is a multi-part message in MIME format. --------------090601040606040300020901 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit I've attached a patch for slight modifications to a variety of __plot###__.m scripts that will allow plot() to be carried out in a single step in most convenient uses. The reason I did this is that with gnuplot one can set the output to PDF and put a series of plots in the file then page through using AcroRead or Xpdf. The problem was that the __plt__.m script used "hold on" for all multiple line and/or symbol plots. The result in the PDF file was, for example, one page with the symbols and a next page with the symbols and stems. From the original writing of __plt__.m it would have been nice to not use "hold on". Even in x11 one line is drawn, then the plot ranges readjust upon the plotting of the second line. Anyhow, the patch would improve things. The patch is a very simple workaround that avoids upsetting the apple cart. I modified __plt1__.m, __plt2__.m, __plt2ss__.m, and __plt2vv__.m to have variable output arguments. Call all these routines without output arguments, they behave just as previously. With output arguments, they return the data and the associated format string... EXCEPT in the case of matrices which are done as a loop so format strings are not easily returned. In the latter case functions return empty matrices and __plt__.m can adjust accordingly. __plt__.m will save all the returned data and construct a single gnuplot string for the plots. The exception is that when matrices are passed into the plot() function. In that case, the matrix portions utilize the same "hold on" approach. Hence, if one uses just a string of vectors in the plot command, e.g., plot([1:50], "-r;steep;", [1:50]*2, "-g;steeper;") You should see slightly nicer behavior. ... I also attached a patch from a few weeks back in case someone wants that. ... Inside __plt__.m is a variable "first_plot = 1;" What is first_plot? Doesn't look like it is used anywhere. ... Anyone recall the issue with the comment below?: -- Function File: contour (X, Y, Z, N) Make a contour plot of the three-dimensional surface described by Z. Someone needs to improve `gnuplot''s contour routines before this will be very useful. What is the problem with gnuplot's contour? Dan --------------090601040606040300020901 Content-Type: text/x-patch; name="octave-plot-2_1_64.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="octave-plot-2_1_64.patch" diff -urP plot-2_1_64/__plt1__.m plot/__plt1__.m --- plot-2_1_64/__plt1__.m 2004-12-07 19:10:43.000000000 -0600 +++ plot/__plt1__.m 2005-01-24 03:01:36.000000000 -0600 at @ -23,7 +23,7 @@ ## Author: jwe -function __plt1__ (x1, fmt) +function [varargout] = __plt1__ (x1, fmt) if (nargin < 1 || nargin > 2) usage ("__plt1__ (x1, fmt)"); at @ -53,6 +53,10 @@ x1 = (1:nr)'; endif - __plt2__ (x1, x2, fmt); + if (nargout == 2) + [varargout{1}, varargout{2}] = __plt2__ (x1, x2, fmt); + else + __plt2__ (x1, x2, fmt); + end endfunction diff -urP plot-2_1_64/__plt2__.m plot/__plt2__.m --- plot-2_1_64/__plt2__.m 2004-12-07 19:10:43.000000000 -0600 +++ plot/__plt2__.m 2005-01-24 05:30:51.073522640 -0600 at @ -23,7 +23,7 @@ ## Author: jwe -function __plt2__ (x1, x2, fmt) +function [varargout] = __plt2__ (x1, x2, fmt) if (nargin < 2 || nargin > 3) usage ("__plt2__ (x1, x2, fmt)"); at @ -33,6 +33,11 @@ fmt = ""; endif + if (nargout == 2) + varargout{1} = []; + varargout{2} = []; + end + if (! isstr (fmt)) error ("__plt2__: fmt must be a string"); endif at @ -45,11 +50,19 @@ endif if (isscalar (x1)) if (isscalar (x2)) - __plt2ss__ (x1, x2, fmt); + if (nargout == 2) + [varargout{1}, varargout{2}] = __plt2ss__ (x1, x2, fmt); + else + __plt2ss__ (x1, x2, fmt); + end endif elseif (isvector (x1)) if (isvector (x2)) - __plt2vv__ (x1, x2, fmt); + if (nargout == 2) + [varargout{1}, varargout{2}] = __plt2vv__ (x1, x2, fmt); + else + __plt2vv__ (x1, x2, fmt); + end elseif (ismatrix (x2)) __plt2vm__ (x1, x2, fmt); endif diff -urP plot-2_1_64/__plt2ss__.m plot/__plt2ss__.m --- plot-2_1_64/__plt2ss__.m 2004-12-07 19:10:43.000000000 -0600 +++ plot/__plt2ss__.m 2005-01-24 02:34:04.000000000 -0600 at @ -23,7 +23,7 @@ ## Author: jwe -function __plt2ss__ (x, y, fmt) +function [varargout] = __plt2ss__ (x, y, fmt) if (nargin < 2 || nargin > 3) msg = sprintf ("__plt2ss__ (x, y)"); at @ -40,8 +40,13 @@ if (x_nr == 1 && x_nr == y_nr && x_nc == 1 && x_nc == y_nc) tmp = [x, y]; - cmd = sprintf ("gplot tmp %s", fmt); - eval (cmd); + if (nargout == 2) + varargout{1} = tmp; + varargout{2} = fmt; + else + cmd = sprintf ("gplot tmp %s", fmt); + eval (cmd); + end else error ("__plt2ss__: arguments must be scalars"); endif diff -urP plot-2_1_64/__plt2vv__.m plot/__plt2vv__.m --- plot-2_1_64/__plt2vv__.m 2004-12-07 19:10:43.000000000 -0600 +++ plot/__plt2vv__.m 2005-01-24 02:34:29.000000000 -0600 at @ -23,7 +23,7 @@ ## Author: jwe -function __plt2vv__ (x, y, fmt) +function [varargout] = __plt2vv__ (x, y, fmt) if (nargin < 2 || nargin > 3) msg = sprintf ("__plt2vv__ (x, y)\n"); at @ -57,7 +57,12 @@ endif tmp = [x, y]; - cmd = sprintf ("gplot tmp %s", fmt); - eval (cmd); + if (nargout == 2) + varargout{1} = tmp; + varargout{2} = fmt; + else + cmd = sprintf ("gplot tmp %s", fmt); + eval (cmd); + end endfunction diff -urP plot-2_1_64/__plt__.m plot/__plt__.m --- plot-2_1_64/__plt__.m 2004-12-07 19:10:43.000000000 -0600 +++ plot/__plt__.m 2005-01-24 05:29:44.293674720 -0600 at @ -43,31 +43,47 @@ nargs -= 2; x_set = 1; y_set = 0; + gp_cmd = "gplot"; + gp_cmd_start_length = length (gp_cmd); - ## Gather arguments, decode format, and plot lines. + ## Gather arguments, decode format, gather plot strings, and plot lines. while (nargs-- > 0) fmt = ""; new = varargin{k++}; + if (length(gp_cmd) > gp_cmd_start_length) + cmastr = ", \\\n"; + else + cmastr = ""; + end + if (isstr (new)) if (! x_set) error ("plot: no data to plot"); endif fmt = __pltopt__ (caller, new); if (! y_set) - __plt1__ (x, fmt); + eval (sprintf ("[dat%d gpstr] = __plt1__ (x, fmt);", k)); else - __plt2__ (x, y, fmt); + eval (sprintf ("[dat%d gpstr] = __plt2__ (x, y, fmt);", k)); endif - hold on; + if isempty (gpstr) + hold on; ## Plot done inside function. + else + gp_cmd = sprintf ("%s%s dat%d %s", gp_cmd, cmastr, k, gpstr); + end x_set = 0; y_set = 0; elseif (x_set) if (y_set) - __plt2__ (x, y, fmt); - hold on; + eval (sprintf ("[dat%d gpstr] = __plt2__ (x, y, fmt);", k)); + if isempty (gpstr) + hold on; ## Plot done inside function. + else + gp_cmd = sprintf ("%s%s dat%d %s", gp_cmd, cmastr, k, gpstr); + end x = new; y_set = 0; else at @ -85,12 +101,21 @@ if (x_set) if (y_set) - __plt2__ (x, y, fmt); + eval (sprintf ("[dat%d gpstr] = __plt2__ (x, y, fmt);", k)); else - __plt1__ (x, fmt); + eval (sprintf ("[dat%d gpstr] = __plt1__ (x, fmt);", k)); endif + if isempty (gpstr) + hold on; ## Plot done inside function. + else + gp_cmd = sprintf ("%s%s dat%d %s", gp_cmd, cmastr, k, gpstr); + end endif + if (length (gp_cmd) > gp_cmd_start_length) + eval (gp_cmd); + end + unwind_protect_cleanup if (! hold_state) --------------090601040606040300020901 Content-Type: text/x-patch; name="__pltopt1__.m.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="__pltopt1__.m.diff" --- __pltopt1__.m.orig 2004-12-07 19:10:43.000000000 -0600 +++ __pltopt1__.m 2005-01-02 22:31:34.488511888 -0600 at @ -101,6 +101,8 @@ set_linestyle = "dot"; elseif (strcmp (char, " at ")) set_points = 1; + set_symbol = 1; + symbol = "7"; elseif (strcmp (char, "^")) set_impulses = 1; elseif (strcmp (char, "L")) at @ -145,19 +147,19 @@ elseif (strcmp (char, "*")) set_points = 1; set_symbol = 1; - symbol = "6"; + symbol = "3"; elseif (strcmp (char, "+")) set_points = 1; set_symbol = 1; - symbol = "2"; + symbol = "1"; elseif (strcmp (char, "o")) set_points = 1; set_symbol = 1; - symbol = "1"; + symbol = "6"; elseif (strcmp (char, "x")) set_points = 1; set_symbol = 1; - symbol = "4"; + symbol = "2"; elseif (strcmp (char, ";")) # title mode. working = 1; while (working) --------------090601040606040300020901--