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

Duncan Murdoch murdoch at stats.uwo.ca
Thu Jun 2 14:45:51 CEST 2005


I think allowing the user to change the labels is a good idea, but have 
some nitpicking about the details.

- Could you grab a copy of the current axis.Date source from

https://svn.r-project.org/R/trunk/src/library/graphics/R/datetime.R

and edit that, rather than what you see in R?  There are some comments 
in the source that shouldn't be lost.  This will also mean that it's 
easier to detect what changes you've made.

- I'd prefer the interpretation of the labels argument to be very 
similar to what axis() does, i.e. NULL should not be treated specially.
(Actually, I think axis() treats labels=NULL as TRUE, but that's 
undocumented and might be an accident.)

- axis.POSIXct() should be modified in a corresponding way.

- Your test

  if (missing(labels) || labels == TRUE)

will generate warnings if a vector of labels is passed in.  A better 
test is "identical(labels, TRUE)".

- If you set the default value for labels to TRUE, then you don't need 
the "missing(labels)" part of the test.

- Could you also edit

https://svn.r-project.org/R/trunk/src/library/graphics/man/axis.POSIXct.Rd

to reflect your changes?

If you want help with this feel free to contact me off the list; when 
you're done, you can send me the files and I'll review and commit the 
changes.

Duncan Murdoch

gavin.simpson at ucl.ac.uk wrote:
> 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 at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list