【问题标题】:abline() in zoo plot puts lines in wrong location动物园情节中的 abline() 将线条放在错误的位置
【发布时间】:2021-10-25 08:38:49
【问题描述】:

我看到 here abline() 不适用于 xts 绘图。我通常使用xts 对象中的plot(as.zoo()) 并遇到以下问题。让我们首先生成一些虚拟时间序列数据(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")

【问题讨论】:

  • 查看axis(3),您将日期与日期时间对象混合在一起plot(as.zoo(ts), type = "p"); abline(v = as.numeric(strptime("1950-01-01 00:30", format = "%Y-%m-%d %H:%M", tz = "UTC")))as.numeric(as.Date("1950-01-01")) 在x 轴的刻度上约为0
  • ...很好,谢谢。有没有机会让abline() 在给定的日期时间对象上绘图?
  • 是的,出于某种原因,您只需要在我的示例中使用abline(v = as.numeric(...)),我认为这对您来说是自动/强制转换为数字的,但显然不是
  • 啊,我明白了,abline(v = as.numeric(strptime("1950-01-01 00:30", format = "%Y-%m-%d %H:%M", tz = "UTC"))) 确实有效,谢谢。你想把这个公式化为答案吗?

标签: r plot xts zoo abline


【解决方案1】:

这里有几个问题:

  1. abline 不知道您在创建绘图时最初在 X 轴上使用的类。它只取你给它的任何内部数值。如果您使用一个类绘制它并在abline 中使用不同的类,它将无法正常工作。

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

  3. 关于帖子的主题,这与动物园无关。 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")

【讨论】:

    猜你喜欢
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多