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

From: <murdoch_at_stats.uwo.ca>
Date: Thu 02 Jun 2005 - 12:48:08 GMT


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

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.

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

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

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@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@stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu Jun 02 22:54:14 2005

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