Ilya Zakharevich on Fri, 9 Oct 1998 17:52:27 -0400 (EDT)


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Improved variant of patch to plot()


When inspecting the output of plot(), I found that the output of the
labels was completely screwed up, which an addition to visual clutter
misplaces data points where function takes the minimal values.

Here is the improved variant of the previous patch which puts the
label in "%g" format, and in correct places.

Now 
	plot(x=2,4,6+sin(x^3)) 
outputs:

        7 "x''''''''''_"x''''''''"_''''''"_'''''"'''''"''''__'''__'''"'''x
          | x            _      "       x :    x x     _   ::   ::       :
          |  x       "         _   _       :   : :   " :  :  : :  : _ _ :|
          |   _     x     x            _   x  :   :  :  : _  : :  : : : :|
          |                   _     _         x   x :   _ :  " "  _:   :"|
          |    "_  "       "          _     _       "    :         :   : |
          |      x"         ""       "       "     "     "    x    "   " |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
          |                                                              |
        0 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
          2                                                              4


--- ./pari-2.0.11.beta/src/graph/plotport.c~	Thu Oct  8 02:10:20 1998
+++ ./pari-2.0.11.beta/src/graph/plotport.c	Fri Oct  9 17:42:59 1998
@@ -47,7 +47,7 @@ PARI_plot pari_plot, pari_psplot;
 #define XX_LOWER '.'
 #define FF1 '_'
 #define FF2 'x'
-#define FF3 '*'
+#define FF3 '"'
 #define PICT(j) ((j) % 3 ? ((j) % 3 == 2 ? FF3 : FF2) : FF1)
 
 void
@@ -55,7 +55,7 @@ plot(entree *ep, GEN a, GEN b, char *ch)
 {
   long av = avma, av2,limite,jz,j,i,sig;
   GEN p1,p2,ysml,ybig,x,diff,dyj,dx,y[ISCR+1];
-  char scr[ISCR+1][JSCR+1], z;
+  char scr[ISCR+1][JSCR+1], z, jprev, jnew;
 
   sig=gcmp(b,a); if (!sig) return;
   if (sig<0) { x=a; a=b; b=x; }
@@ -94,10 +94,39 @@ plot(entree *ep, GEN a, GEN b, char *ch)
   for (i=1; i<=ISCR; i++)
   {
     scr[i][jz]=z; j=3+gtolong(gmul(gsub(y[i],ysml),dyj));
-    scr[i][j/3] = PICT(j); avma=av2;
+    jnew = j/3;
+    if (i > 1) {
+	int i_up, i_down,  mid = (jprev + jnew)/2, up, down;
+	int domid = 0, jmid;
+	
+	/* If the gap is 1, leave it as it is. */
+	if (jprev < jnew - 2) {
+	    i_up = i;
+	    i_down = i - 1;
+	    up = jnew - 1;
+	    down = jprev + 1;
+	    domid = 1;
+	} else if (jnew < jprev - 2) {
+	    i_up = i - 1;
+	    i_down = i;
+	    down = jnew + 1;
+	    up = jprev - 1;
+	    domid = 1;
+	}
+	if (domid) {
+	    while (down <= mid) {
+		scr[i_down][down++] = ':';
+	    }
+	    while (up > mid) {
+		scr[i_up][up--] = ':';
+	    }
+	}
+    }
+    scr[i][jnew] = PICT(j); avma=av2;
+    jprev = jnew;
   }
   p1=cgetr(3); gaffect(ybig,p1); pariputc('\n');
-  pariputsf(" %8.3e",rtodbl(p1));
+  pariputsf(" %8.3g ",rtodbl(p1));
   for (i=1; i<=ISCR; i++) pariputc(scr[i][JSCR]);
   pariputc('\n');
   for (j=(JSCR-1); j>=2; j--)
@@ -107,12 +136,12 @@ plot(entree *ep, GEN a, GEN b, char *ch)
     pariputc('\n');
   }
   p1=cgetr(3); gaffect(ysml,p1);
-  pariputsf("%8.3e",rtodbl(p1));
+  pariputsf(" %8.3g ",rtodbl(p1));
   for (i=1; i<=ISCR; i++)  pariputc(scr[i][1]);
   pariputc('\n');
   p1=cgetr(3); gaffect(a,p1);
   p2=cgetr(3); gaffect(b,p2);
-  pariputsf("%8s %8.3e %44s %8.3e\n"," ",rtodbl(p1)," ",rtodbl(p2));
+  pariputsf("%10s%-8.3g%*s%8.3g\n"," ",rtodbl(p1),ISCR-16," ",rtodbl(p2));
   pop_val(ep); avma=av;
 }