¿Cómo obtener una geom_vline vertical en un eje x de la fecha de la clase?

109

Aunque encontré la publicación de Hadley en el grupo de Google en POSIXcty geom_vline, no pude hacerlo. Tengo una serie de tiempo y me gustaría dibujar una línea vertical para los años 1998, 2005 y 2010, por ejemplo. Intenté con la sintaxis ggploty qplot, pero todavía no veo ninguna línea vertical o la línea vertical se dibuja en la primera cuadrícula vertical y toda la serie se desplaza de manera algo extraña hacia la derecha.

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

Mi campo de fecha tiene el formato "1993-07-01" y es de clase Date.

Matt Bannert
fuente
1
¿Puede agregar algunas filas de su marco de datos para que podamos probar su ejemplo?
Sarah West

Respuestas:

141

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

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

Un ejemplo de prueba 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)

diagrama de ejemplo de geom_vline

rcs
fuente
¡Encontré el 'as.numeric ()' en realidad bastante difícil de encontrar! Gracias.
arno_v
3
Me pregunto si geom_vline(aes(xintercept=as.numeric(x[c(13, 24)])), linetype=4, colour="black")sería más idiomático, es decir, usar en aeslugar de tmp$.
David Arenburg
1
Esta solución ya no funciona. El código produce `` Error: se intentó crear una capa sin estadísticas. Ejecute rlang::last_error()para ver dónde ocurrió el error. ''
CoderGuy123
30

También puede hacerlo geom_vline(xintercept = as.numeric(as.Date("2015-01-01")), linetype=4)si desea que la línea permanezca en su lugar, ya sea que su fecha esté en la fila 120 o no.

D.Hadley
fuente
13
en mi máquina (Win10 con R 3.2.2 y ggplot 1.0.1), tengo que forzar la fecha a POSIXct para que se alinee correctamente: as.POSIXct(as.Date(c("2016-12-01","2017-02-01")))
Jthorpe
Gracias Jthorpe ... esta es la única versión que funcionó para mí
ColorStatistics
2

as.numeric funciona para mí

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()

salida de código

Esteban M. Correa
fuente