【问题标题】:custom axis labels plotting a forecast in R在 R 中绘制预测的自定义轴标签
【发布时间】:2014-07-09 15:46:56
【问题描述】:

我正在尝试为预测添加一些合理的标签。

这是我的代码:

library("forecast")

t <- ts(
  c(
    4410.0, 6435.0, 
    4939.0, 6487.0, 25521.0, 18764.0, 
    12223.0, 18590.0, 36898.0, 28826.0, 
    20329.0
    )  
  , frequency = 4
  , start=c(2011, 7, 1)
)

cast <- meanf(t,h=4)

par(mfrow=c(1,1),xaxt="n")
plot(cast)

ticks <- seq(as.POSIXct("2011-07-01"), by = "3 month", length.out=length(cast) + 4) 
axis.Date(1, at = ticks, labels = ticks, format="%Y-%m")

没有错误或警告......但没有轴被添加到图中:(

如果我使用xaxt="s",那么我会得到轴标签,但它们不是像 2014.0 那样的东西(即根本没有格式化为日期)。理想情况下,我实际上更喜欢“2014 年第三季度”之类的可读性更高的内容,但我会选择 2014-07 年(本季度的第一个月)。

知道我做错了什么吗?我在互联网上找到的所有东西都建议禁用默认轴,然后使用轴或轴。日期函数来添加自定义...但我无法使用这些方法中的任何一种获得任何类型的轴:(

【问题讨论】:

  • 有趣的是,如果您执行直接来自the help page to plot.forecastplot(hw(USAccDeaths,h=48)),您也不会得到时间轴注释。我会说这有资格作为一个错误。我会向 Rob Hyndman 指出这一点。
  • @Stephan Kolassa 如果我这样做require(forecast); plot(hw(USAccDeaths,h=48)),我会在时间轴上看到标签。也许您没有重置图形参数并且仍然具有问题中给出的示例中的配置par(mfrow=c(1,1),xaxt="n")(这发生在我身上)。

标签: r time-series data-visualization


【解决方案1】:

我不会说有错误,而是函数forecast::plot.forecast 不是设计为与axis.Dateaxis.POSIXct 一起使用(在包forecast 中没有使用)。

在调用函数axis.Dateaxis.POSIXct 之前,必须将时间点作为DatePOSIXct 对象的序列显式传递给plot。如果我们将时间序列绘制为plot(t),那么 x 轴似乎没有被正确定义为供上述函数使用。

查看下面的代码以及如何创建变量time 并将其传递给plot。使用plot(time, x) 而不仅仅是plot(x)。因此函数axis 将能够显示时间轴的标签。 (在这个例子中,置信区间看起来不如那些 由forecast::plot.forecast显示。)

library("forecast")
require(zoo)

t <- ts(
  c(
    4410.0, 6435.0, 
    4939.0, 6487.0, 25521.0, 18764.0, 
    12223.0, 18590.0, 36898.0, 28826.0, 
    20329.0
    )  
  , frequency = 4
  , start=c(2011, 7, 1)
)
cast <- meanf(t, h=4)

x <- ts(c(t, cast$mean), start = c(start(t), 1), frequency = frequency(t))
time <- as.yearqtr(seq(start(x)[1], end(x)[1] + 1, 1/frequency(x)))
time <- time[seq_along(x)]
time <- as.POSIXct(time)
plot(time, x, type = "n", xaxt = "n", ylim = range(c(cast$lower, cast$upper)))
lines(time[seq_along(t)], t)
lines(time[-seq_along(t)], cast$mean, col = "blue")
lines(time[-seq_along(t)], cast$upper[,2], col = "red")
lines(time[-seq_along(t)], cast$lower[,2], col = "red")
ticks <- seq(as.POSIXct("2011-07-01"), by = "3 month", length.out=length(cast) + 4) 
axis(side = 1, at = ticks, labels = ticks)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2023-03-02
    • 2014-01-06
    • 2021-08-20
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多