Reputation: 786
I'm trying to get some sensible labels on a forecast.
Here's my code:
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")
There are no errors or warnings... but no axis gets added to the plot :(
If I use xaxt="s"
then I do get axis labels, but they're not they're things like 2014.0 (i.e. not formatted as dates at all). Ideally I'd actually like something a bit more readable like "Q3 2014" but I'd settle for 2014-07 (the first month in the quarter).
Any idea what I'm doing wrong? All of the stuff I've found searching the internet suggests disabling the default axis and then using the axis or axis.Date functions to add a custom on... but I can't get an axis of any sort using either of those methods :(
Upvotes: 2
Views: 2423
Reputation: 1049
I would not say there is a bug, rather the function forecast::plot.forecast
is not designed to be used with axis.Date
or axis.POSIXct
(which are not used in the package forecast
).
Before calling the functions axis.Date
and axis.POSIXct
, the time points must be explicitly passed to plot
as a sequence of Date
or POSIXct
objects. If we plot the time series as plot(t)
then the x-axis does not seem to be properly defined as to be used by the above functions.
See the code below and how the variable time
is created and passed to plot
. plot(time, x)
is used instead of just plot(x)
. Thus the function axis
will be able to display the labels of the time axis. (In this example, the confidence intervals will not look as nice as those
displayed by 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)
Upvotes: 1