Comment obtenir une geom_vline verticale sur un axe x de la date de classe?

109

Même si j'ai trouvé le message de Hadley dans le groupe Google sur POSIXctet geom_vline, je n'ai pas pu le faire. J'ai une série chronologique et j'aimerais tracer une ligne verticale pour les années 1998, 2005 et 2010 par exemple. J'ai essayé avec ggplotet la qplotsyntaxe, mais je ne vois toujours aucune ligne verticale ou la ligne verticale est dessinée à la toute première grille verticale et toute la série est décalée quelque peu étrangement vers la droite.

gg <- ggplot(data=mydata,aes(y=somevalues,x=datefield,color=category)) +
      layer(geom="line")
gg + geom_vline(xintercept=mydata$datefield[120],linetype=4)
# returns just the time series plot I had before, 
# interestingly the legend contains dotted vertical lines

Mon champ de date a le format "01/07/1993" et est de classe Date.

Matt Bannert
la source
1
Pouvez-vous ajouter quelques lignes de votre dataframe, afin que nous puissions essayer votre exemple?
Sarah West

Réponses:

141

Essayez as.numeric(mydata$datefield[120]):

gg + geom_vline(xintercept=as.numeric(mydata$datefield[120]), linetype=4)

Un exemple de test simple:

library("ggplot2")

tmp <- data.frame(x=rep(seq(as.Date(0, origin="1970-01-01"),
                            length=36, by="1 month"), 2),
                  y=rnorm(72),
                  category=gl(2,36))

p <- ggplot(tmp, aes(x, y, colour=category)) +
     geom_line() +
     geom_vline(xintercept=as.numeric(tmp$x[c(13, 24)]),
                linetype=4, colour="black")
print(p)

Exemple de graphique geom_vline

rcs
la source
J'ai trouvé le 'as.numeric ()' en fait assez difficile à trouver! Merci.
arno_v
3
Je me demande si geom_vline(aes(xintercept=as.numeric(x[c(13, 24)])), linetype=4, colour="black")serait plus idiomatique, c'est-à-dire en utilisant aesau lieu de tmp$.
David Arenburg
1
Cette solution ne fonctionne plus. Le code produit `` Erreur: tentative de création de couche sans statistique. Exécutez rlang::last_error()pour voir où l'erreur s'est produite. ''
CoderGuy123
30

Vous pouvez également le faire geom_vline(xintercept = as.numeric(as.Date("2015-01-01")), linetype=4)si vous souhaitez que la ligne reste en place, que votre date soit ou non dans la 120e ligne.

D.Hadley
la source
13
sur ma machine (Win10 avec R 3.2.2 et ggplot 1.0.1), je dois forcer la date à POSIXct pour qu'elle s'aligne correctement: as.POSIXct(as.Date(c("2016-12-01","2017-02-01")))
Jthorpe
Merci Jthorpe .. c'est la seule version qui a fonctionné pour moi
ColorStatistics
2

as.numeric fonctionne pour moi

ggplot(data=bmelt)+
  geom_line(aes(x=day,y=value,colour=type),size=0.9)+
  scale_color_manual(labels = c("Observed","Counterfactual"),values = c("1","2"))+
  geom_ribbon(data=ita3,aes(x=day, 
      y=expcumresponse, ymin=exp.cr.ll,ymax=exp.cr.uu),alpha=0.2) +
  labs(title="Italy Confirmed cases",
        y ="# Cases ", x = "Date",color="Output")+
  geom_vline(xintercept = as.numeric(ymd("2020-03-13")), linetype="dashed", 
                color = "blue", size=1.5)+
  theme_minimal()

sortie de code

Esteban M. Correa
la source