patch to plot all data at once without "hold on" if possible

Daniel J Sebald <[email protected]> Mon, 24 Jan 2005 05:43:34 -0600
Newsgroups gmane.comp.gnu.octave.maintainers,gmane.comp.gnu.octave.graphics
Message-ID <[email protected]>
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
octave-plot-2_1_64.patch (text/x-patch, 5.4 KB)
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
@@ -23,7 +23,7 @@
 
 ## Author: jwe
 
-function __plt1__ (x1, fmt)
+function [varargout] = __plt1__ (x1, fmt)
 
   if (nargin < 1 || nargin > 2)
     usage ("__plt1__ (x1, fmt)");
@@ -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
@@ -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)");
@@ -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
@@ -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
@@ -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)");
@@ -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
@@ -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");
@@ -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
@@ -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
@@ -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)
__pltopt1__.m.diff (text/x-patch, 951 B)
--- __pltopt1__.m.orig	2004-12-07 19:10:43.000000000 -0600
+++ __pltopt1__.m	2005-01-02 22:31:34.488511888 -0600
@@ -101,6 +101,8 @@
       set_linestyle = "dot";
     elseif (strcmp (char, "@"))
       set_points = 1;
+      set_symbol = 1;
+      symbol = "7";
     elseif (strcmp (char, "^"))
       set_impulses = 1;
     elseif (strcmp (char, "L"))
@@ -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)