如何在Date轴上获取轴刻度

时间:2016-09-03 10:44:30

标签: r plot

对于普通轴,我们可以使用axTicks获取刻度值。如果x是Date,则此尝试失败。

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返回值,但显然不是最终使用的值。我们如何获得使用过的刻度?

1 个答案:

答案 0 :(得分:3)

我认为情节的刻度位置是由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
}

如果你相反看一下axTicks的来源,你可以看到,对于日期,它会归结为seq.int(axp[1L], axp[2L], length.out = 1L + abs(axp[3L])) axp = par("xaxp")。因此,它只是将日期转换为数字并均匀地划分结果范围。