Re: [R] breaking an axis (skipping part of it)

About this list Date view Thread view Subject view Author view

From: ben@zoo.ufl.edu
Date: Tue 06 Mar 2001 - 04:55:54 EST


Message-ID: <Pine.LNX.4.30.0103051342380.10136-100000@bolker.zoo.ufl.edu>


  These generally have to be done by hand, in part because this kind of
manipulation is going to vary a lot on a case-by-case basis. However,
here's something to get you started -- a function to draw a break in an
axis, and some sample code (at the bottom) using it.

axis.break <- function(brkpos, which = "y", brkwid = 0.02, brksep = 0.01,
        brkslant = 0.02, oldstyle=FALSE) {
##
## brkpos: position of the break along the chosen axis
## which: which axis to break (bottom ("x") or left ("y")
# dimensions (given in proportion of chosen axis)
## brkwid: width of the axis break lines perpendicular to the axis
## brksep: separation between two axis breaks/height
## brkslant: (only used for oldstyle) parameter determining angle
## of axis breaks
## oldstyle = two parallel lines, new style=zigzag
##
## FIXME: this would be easier to do in inches rather than in user units:
## wouldn't need to mess around with log/linear scale adjustments
        par.old <- par(no.readonly=TRUE)
        par(xpd = TRUE) ## useful to set clipping off
        usrax <- par("usr")
        if(which == "x") {
             # break in x axis
                axpos <- usrax[3]
                axwid1 <- usrax[2] - usrax[1] # x-axis width
                axwid2 <- usrax[4] - usrax[3] # y-axis width
                otherax <- "y"
                tmpseg <- function(...) segments(...,xpd=TRUE)
        }
        else {
             # break in y axis
                axpos <- usrax[1]
                axwid2 <- usrax[2] - usrax[1] # x-axis width
                axwid1 <- usrax[4] - usrax[3] # y-axis width
                tmpseg <- function(w, x, y, z, ...) {
                     segments(x, w, z, y, xpd=TRUE, ...) # scramble arguments
                }
                otherax <- "x"
        }
        brkwid <- brkwid * axwid2
        brksep <- brksep * axwid1
        brkslant <- brkslant * axwid1
        thislog <- (par(eval(paste(which, "axt", sep = ""))) == "l")
        otherlog <- (par(eval(paste(otherax, "axt", sep = ""))) == "l")
        if (thislog) brkpos <- log10(brkpos)
        if (thislog & otherlog)
           plotf <- function(w, x, y, z)
              (tmpseg(10^w, 10^x, 10^y, 10^z))
        else if (thislog & !otherlog)
           plotf <- function(w, x, y, z)
              (tmpseg(10^w, x, 10^y, z))
        else if (!thislog & otherlog)
           plotf <- function(w, x, y, z)
              (tmpseg(w, 10^x, y, 10^z))
        else # linear scale
           plotf <- tmpseg
        if (oldstyle) {
           plotf(brkpos + brksep - brkslant, axpos - brkwid, brkpos + brksep +
              brkslant, axpos + brkwid)
           plotf(brkpos - brksep - brkslant, axpos - brkwid, brkpos - brksep +
              brkslant, axpos + brkwid)
         } else {
           plotf(brkpos + brksep, axpos, brkpos - brksep, axpos, col=par("bg"))
           plotf(brkpos + brksep, axpos, brkpos + brksep/2, axpos - brkwid)
           plotf(brkpos + brksep/2, axpos-brkwid, brkpos - brksep/2, axpos + brkwid)
           plotf(brkpos - brksep/2, axpos+brkwid, brkpos - brksep, axpos)
         }
        invisible(par(par.old))
}

## example

x <- c(1:10)
y <- c(1:9,100)
axbrkstart <- 10
axbrkstop <- 100
axbrkwid <- axbrkstop-axbrkstart
y2 <- y
y2[y2>=axbrkstart] <- y2[y2>=axbrkstart]-axbrkwid
plot(x,y2,axes=FALSE,ylim=c(0,11))
box(bty="l")
axis(side=1)
axis(side=2,at=seq(0,8,by=2))
axis(side=2,at=10,labels="100")
axis.break(9.5)

On Mon, 5 Mar 2001, Moritz Lennert wrote:

> Hello,
>
> Is it possible to skip part of an axis in order to adapt the axis to the
> "normal" values and not to an outlier, but still have the outlier in the
> graph ? I.e. have my axis go from 1 to 100, then break the axis in some
> way, and continue with 500 to 600 ?
>
> Moritz
>
> P.S. Please cc the answer to my address since I'm not in the mailing
> list.
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> Send "info", "help", or "[un]subscribe"
> (in the "body", not the subject !) To: r-help-request@stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
>

-- 
318 Carr Hall                                bolker@zoo.ufl.edu
Zoology Department, University of Florida    http://www.zoo.ufl.edu/bolker
Box 118525                                   (ph)  352-392-5697
Gainesville, FL 32611-8525                   (fax) 352-392-3704

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request@stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


About this list Date view Thread view Subject view Author view

This archive was generated by hypermail 2b30 : Fri 22 Jun 2001 - 18:58:35 EST