2016-09-03 2 views
0

Для обычной оси мы можем получить значения тика с помощью axTicks. Если x - дата, эта попытка не выполняется.Как получить осевые оси на оси даты

x <- sort(sample(seq(as.Date("2000-01-01"), as.Date("2010-12-31"), by=1), 50)) 
y <- runif(50) 
plot(y~x, type="l", col="steelblue") 

axTicks(1) 
abline(v=axTicks(1)) 

axTicks возвращает значения, но, очевидно, не используемые в конечном итоге. Как мы можем использовать использованные клещи?

ответ

2

Я думаю, что позиции тика для участка создаются axis.Date. Для того, чтобы получить позиции можно скопировать соответствующие части axis.Date в своей собственной функции:

dateTicks <- function(x, side = 1) { 
## This functions is almost a copy of axis.Date 
    x <- as.Date(x) 
    range <- par("usr")[if (side%%2) 
     1L:2L 
     else 3:4L] 
    range[1L] <- ceiling(range[1L]) 
    range[2L] <- floor(range[2L]) 
    d <- range[2L] - range[1L] 
    z <- c(range, x[is.finite(x)]) 
    class(z) <- "Date" 
    if (d < 7) 
     format <- "%a" 
    if (d < 100) { 
     z <- structure(pretty(z), class = "Date") 
     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[1L], m) 
     zz$year <- c(m, m + 1) 
     z <- as.Date(zz) 
     format <- "%b" 
    } 
    else { 
     zz <- as.POSIXlt(z) 
     zz$mday <- 1 
     zz$mon <- 0 
     zz$year <- pretty(zz$year) 
     z <- as.Date(zz) 
     format <- "%Y" 
    } 
    keep <- z >= range[1L] & z <= range[2L] 
    z <- z[keep] 
    z <- sort(unique(z)) 
    class(z) <- "Date" 
    z 
} 

Если вы в отличие посмотреть на источник для вы можете увидеть, что для даты сводится к seq.int(axp[1L], axp[2L], length.out = 1L + abs(axp[3L])) с axp = par("xaxp"). Таким образом, он просто преобразует даты в числовые и делит результирующий диапазон равномерно.

+0

Хм, теперь я понимаю, что ось не знает о классе x, когда-то используемом для конфигурации ... Большое спасибо за ваше решение, я поставлю этот код в функцию axTicks.Date. –

Смежные вопросы