[Rd] Wishlist: more flexible handling of tick labels in axis.Date (PR#7913)

From: <gavin.simpson_at_ucl.ac.uk>
Date: Thu 02 Jun 2005 - 11:45:09 GMT


Full_Name: Gavin Simpson
Version: 2.1.0-patched (1-Jun-2005)
OS: Linux (Fedora Core 3)
Submission from: (NULL) (128.40.32.76)

axis.Date() insists on labelling tick marks. It could be made more flexible by allowing the user to specify if they want the ticks to be labelled, for example, to add un-labelled minor ticks for "months", added to a plot with "years" labelled. The user can not define labels = "" in the "..." in the call to axis.Date() as axis.Date() calls axis() with labels = labels explicitly, resulting in:

Error in axis(side, at = z, labels = labels, ...) :

        formal argument "labels" matched by multiple actual arguments

if you try.

One way round this would be to add labels as a named argument to axis.Date() and to allow labels to be NULL (missing), TRUE or FALSE. A first attempt at this is shown below:

axis.Date2 <- function (side, x, at, format, labels, ...) {

    mat <- missing(at)
    if (!mat)

        x <- as.Date(at)
    else x <- as.Date(x)
    range <- par("usr")[if (side%%2)

        1:2
    else 3:4]
    range[1] <- ceiling(range[1])
    range[2] <- floor(range[2])
    d <- range[2] - range[1]
    z <- c(range, x[is.finite(x)])
    class(z) <- "Date"
    if (d < 7)

        if (missing(format))
            format <- "%a"
    if (d < 100) {
        z <- structure(pretty(z), class = "Date")
        if (missing(format))
            format <- "%b %d"

}

    else if (d < 1.1 * 365) {
        zz <- as.POSIXlt(z)
        zz$mday <- 1
        zz$mon <- pretty(zz$mon)
        m <- length(zz$mon)
        m <- rep.int(zz$year[1], m)
        zz$year <- c(m, m + 1)
        z <- .Internal(POSIXlt2Date(zz))
        if (missing(format))
            format <- "%b"

}

    else {
        zz <- as.POSIXlt(z)
        zz$mday <- 1
        zz$mon <- 0
        zz$year <- pretty(zz$year)
        z <- .Internal(POSIXlt2Date(zz))
        if (missing(format))
            format <- "%Y"

}

    if (!mat)

        z <- x[is.finite(x)]
    z <- z[z >= range[1] & z <= range[2]]     z <- sort(unique(z))
    # if labels is missing or TRUE generate labels for ticks     if (missing(labels) || labels == TRUE)       labels <- format.Date(z, format = format)     # else rep "" to suppress labelling
    else labels <- rep("", length(z))

    axis(side, at = z, labels = labels, ...) }

An example of using this with the Date example from ?plot.Date :

random.dates <- as.Date("2001/1/1") + 70*sort(runif(100)) plot(random.dates, 1:100, xaxt="n")
axis.Date2(1, at=seq(as.Date("2001/1/1"), max(random.dates)+6, "weeks")) axis.Date2(1, at=seq(as.Date("2001/1/1"), max(random.dates)+6, "days"),

    labels = FALSE, tcl = -0.2)

The function should perhaps enforce NULL/TRUE/FALSE for labels, or could be enhanced to allow labels = "" explicitly or to allow user defined vector for labels that is of length(at).

Thanks,

Gavin



R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu Jun 02 21:56:06 2005

This archive was generated by hypermail 2.1.8 : Mon 20 Feb 2006 - 03:21:06 GMT