动物园情节中的 abline() 将线放在错误的位置

abline() in zoo plot puts lines in wrong location

我看到 abline() 不适用于 xts 图。我通常使用 plot(as.zoo()) of xts 个对象和 运行 来解决以下问题。让我们首先生成一些虚拟时间序列数据(startend 的定义变得至关重要):

library(xts)
start <- strptime("1888-01-01 00:30", format = "%Y-%m-%d %H:%M", tz = "UTC")
end   <- strptime("2019-12-31 00:10", format = "%Y-%m-%d %H:%M", tz = "UTC")
n <- 1000
dates <- seq(start, end, length.out = n)
set.seed(1)
dat <- rnorm(n)
ts <- xts(dat, order.by = dates)

现在让我们尝试将 ts 绘制为 zoo 对象并添加线条:

plot(as.zoo(ts), type = "p")
abline(v = as.Date("1950-01-01"), col = "red") # not placed at the right location
abline(v = as.Date("2000-01-01"), col = "blue") # same (wrong) placement
abline(v = strptime("1950-01-01 00:00", format = "%Y-%m-%d %H:%M", tz = "UTC"), col = "green") # also fails

所有 abline() 调用似乎都在同一个(错误的)位置,为什么?

备注:以下使用 startend 的不同定义,并且按预期工作:

start. <- as.Date(start)
end. <- as.Date(end)
dates. <- seq(start., end., length.out = n)
ts. <- xts(dat, order.by = dates.)
plot(as.zoo(ts.), type = "p")
abline(v = as.Date("1950-01-01"), col = "red")

这里有几个问题:

  1. abline 不知道您在创建绘图时最初在 X 轴上使用的是什么 class。它只需要你给它的任何内部数值。如果您使用一个 class 绘制它并在 abline 中使用不同的 class 它是行不通的。

  2. 在绘图和大多数其他情况下,最好使用 POSIXct class 而不是 POSIXlt class。那就是不要使用 strptime,因为它会产生 POSIXlt。使用 as.POSIXct,因为它会生成 POSIXct。 POSIXlt 对象的内部形式是 9 个组件的列表,abline 无法以所需方式解释。

  3. 关于post的主题,这与动物园无关。 abline 即使没有任何包也能以这种方式工作。如果您使用 plot(dat ~ dates),那么 abline 命令会产生相同的输出。

因此代码应该是

library(xts)

fmt <- "%Y-%m-%d %H:%M"
start <- as.POSIXct("1888-01-01 00:30", format = fmt, tz = "UTC")
end   <- as.POSIXct("2019-12-31 00:10", format = fmt, tz = "UTC")
n <- 1000
dates <- seq(start, end, length.out = n)
set.seed(1)
dat <- rnorm(n)
ts <- xts(dat, order.by = dates)

plot(as.zoo(ts), type = "p")
v <- as.POSIXct("1950-01-01 00:00", format = fmt, tz = "UTC")
abline(v = v, col = "green")