动物园情节中的 abline() 将线放在错误的位置
abline() in zoo plot puts lines in wrong location
我看到 abline()
不适用于 xts
图。我通常使用 plot(as.zoo())
of xts
个对象和 运行 来解决以下问题。让我们首先生成一些虚拟时间序列数据(start
和 end
的定义变得至关重要):
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()
调用似乎都在同一个(错误的)位置,为什么?
备注:以下使用 start
和 end
的不同定义,并且按预期工作:
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")
这里有几个问题:
abline
不知道您在创建绘图时最初在 X 轴上使用的是什么 class。它只需要你给它的任何内部数值。如果您使用一个 class 绘制它并在 abline
中使用不同的 class 它是行不通的。
在绘图和大多数其他情况下,最好使用 POSIXct class 而不是 POSIXlt class。那就是不要使用 strptime
,因为它会产生 POSIXlt。使用 as.POSIXct
,因为它会生成 POSIXct。 POSIXlt 对象的内部形式是 9 个组件的列表,abline
无法以所需方式解释。
关于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")
我看到 abline()
不适用于 xts
图。我通常使用 plot(as.zoo())
of xts
个对象和 运行 来解决以下问题。让我们首先生成一些虚拟时间序列数据(start
和 end
的定义变得至关重要):
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()
调用似乎都在同一个(错误的)位置,为什么?
备注:以下使用 start
和 end
的不同定义,并且按预期工作:
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")
这里有几个问题:
abline
不知道您在创建绘图时最初在 X 轴上使用的是什么 class。它只需要你给它的任何内部数值。如果您使用一个 class 绘制它并在abline
中使用不同的 class 它是行不通的。在绘图和大多数其他情况下,最好使用 POSIXct class 而不是 POSIXlt class。那就是不要使用
strptime
,因为它会产生 POSIXlt。使用as.POSIXct
,因为它会生成 POSIXct。 POSIXlt 对象的内部形式是 9 个组件的列表,abline
无法以所需方式解释。关于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")