2014-07-09 4 views
2

J'essaie d'obtenir des étiquettes sensibles sur une prévision.étiquettes d'axes personnalisés traçant une prévision dans R

Voici mon 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") 

Il n'y a pas d'erreurs ou avertissements ... mais pas d'axe est ajouté à la parcelle :(

Si je xaxt="s" alors je ne reçois des étiquettes d'axe, mais ils ne sont pas des choses comme 2014.0 (c'est-à-dire qu'ils ne sont pas du tout formatés) Idéalement, j'aimerais quelque chose d'un peu plus lisible comme "Q3 2014" mais je me contenterais de 2014-07 (le premier mois le trimestre)

Une idée de ce que je fais mal? Toutes les choses que j'ai fou nd la recherche sur internet suggère de désactiver l'axe par défaut puis d'utiliser l'axe ou l'axe.Date fonctions pour ajouter une coutume sur ... mais je ne peux pas obtenir un axe en utilisant l'une de ces méthodes :(

+0

Il est intéressant, si vous le faites 'plot (hw (USAccDeaths, h = 48))', qui vient tout droit de [la page d'aide à 'plot.forecast'] (http://www.inside-r.org/packages/cran/forecast/docs/plot.forecast), l'axe des temps n'est pas non plus annoté. Je dirais que cela est considéré comme un bug. Je vais montrer à Rob Hyndman. –

+0

@Stephan Kolassa Si je fais 'require (forecast); plot (hw (USAccDeaths, h = 48)) 'Je vois des étiquettes dans l'axe des temps. Peut-être n'avez-vous pas réinitialisé les paramètres graphiques et avez toujours la configuration 'par (mfrow = c (1,1), xaxt =" n ")' à partir de l'exemple donné dans la question (ce qui m'est arrivé). – javlacalle

Répondre

1

I ne dirait pas qu'il y a un bug, plutôt la fonction forecast::plot.forecast n'est pas conçue pour être utilisée avec axis.Date ou axis.POSIXct (qui ne sont pas utilisées dans le paquet forecast).

Avant d'appeler les fonctions axis.Date et axis.POSIXct, les points de temps doivent être transmis explicitement à plot comme une séquence de Date ou POSIXct objets. Si nous tracons la série temporelle comme plot(t) alors l'axe des x ne semble pas être correctement défini pour être utilisé par les fonctions ci-dessus.

Voir le code ci-dessous et comment la variable time est créée et transmise à plot. plot(time, x) est utilisé au lieu de seulement plot(x). Ainsi, la fonction axis pourra afficher les étiquettes de l'axe des temps. (Dans cet exemple, les intervalles de confiance ne sera pas aussi belle que ceux affichés par 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)