Skip to content

Reversing axis in a log plot (PR#7894)

1 message · Uwe Ligges

#
This is a multi-part message in MIME format.
--MIMEStream=_0+99651_873538045512443_0843898189
Content-Type: text/plain; charset="us-ascii"; format=flowed
Content-Transfer-Encoding: 7bit

Please find attached my proposal for a bugfix. The experts might to 
better, though.

Uwe Ligges
ligges@statistik.uni-dortmund.de wrote:

            
--MIMEStream=_0+99651_873538045512443_0843898189
Content-Type: text/plain; name="plot.c.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="plot.c.diff"

--- plot.c-orig	2005-05-27 10:38:39.851718400 +0200
+++ plot.c	2005-05-27 11:40:10.118060800 +0200
@@ -778,8 +778,10 @@
  *  The resulting REAL vector must have length >= 1, ideally >= 2
  */
     SEXP at = R_NilValue;/* -Wall*/
-    double umin, umax, dn, rng, small;
+    SEXP atr = R_NilValue;/* for reversed log axis with axp[2]>0 */
+    double umin, umax, dn, rng, small, reversed;
     int i, n, ne;
+    reversed = 0.; /* for reversed log axis with axp[2]>0 */
     if (!logflag || axp[2] < 0) { /* --- linear axis --- Only use axp[] arg. */
     n = fabs(axp[2]) + 0.25;/* >= 0 */
     dn = imax2(1, n);
@@ -799,6 +801,19 @@
        n = 1,2,3.  see switch() below */
     umin = usr[0];
     umax = usr[1];
+
+    if (umin > umax && axp[0] > axp[1]){
+        /* if we have log axis, axp[2]>0 and reversed axis, many following calculations will fail 
+           (assuming umin < umax etc.), hence simply reverse usr and axp at first.
+           At the end reverse output of atr(eversed) back again. */
+        umin = usr[1];
+        umax = usr[0];
+        reversed = axp[0];
+        axp[0] = axp[1];
+        axp[1] = reversed;
+        reversed = 1.;
+    }
+    
     /* Debugging: When does the following happen... ? */
     if (umin > umax)
         warning("CreateAtVector \"log\"(from axis()): "
@@ -899,7 +914,15 @@
           axp[2]);
     }
     }
-    return at;
+    if(reversed == 1.){
+        /* we have to reverse the output back again (reversed log axis with axp[2]>0) */
+        atr = allocVector(REALSXP, n);
+        for (i = 0; i < n; i++)
+            REAL(atr)[i] = REAL(at)[n-i-1];
+        return atr;
+    }
+    else 
+        return at;
 }
 
 static double ComputePAdjValue(double padj, int side, int las)

--MIMEStream=_0+99651_873538045512443_0843898189--