Come ottenere una geom_vline verticale su un asse x della data della lezione?


109

Anche se ho trovato il post di Hadley nel gruppo google su POSIXcte geom_vline, non sono riuscito a farlo. Ho una serie storica e vorrei tracciare una linea verticale per gli anni 1998, 2005 e 2010, ad esempio. Ho provato con ggplote la qplotsintassi, ma ancora non vedo alcuna linea verticale o la linea verticale è disegnata alla primissima griglia verticale e l'intera serie è spostata in modo un po 'strano a destra.

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

Il mio campo data ha il formato "1993-07-01" ed è di classe Date.


1
Puoi aggiungere alcune righe del tuo dataframe, in modo che possiamo provare il tuo esempio?
Sarah West

Risposte:


141

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

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

Un semplice esempio di prova:

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)

grafico di esempio geom_vline


Ho trovato "as.numeric ()" piuttosto difficile da trovare! Grazie.
arno_v

3
Mi chiedo se geom_vline(aes(xintercept=as.numeric(x[c(13, 24)])), linetype=4, colour="black")sarebbe più idiomatico, cioè usare aesinvece di tmp$.
David Arenburg

1
Questa soluzione non funziona più. Il codice produce `` Errore: tentativo di creare un livello senza statistiche. Corri rlang::last_error()per vedere dove si è verificato l'errore. ''
CoderGuy123

30

Puoi anche farlo geom_vline(xintercept = as.numeric(as.Date("2015-01-01")), linetype=4)se vuoi che la linea rimanga a posto indipendentemente dal fatto che la tua data sia o meno nella 120a riga.


13
sulla mia macchina (Win10 con R 3.2.2 e ggplot 1.0.1), devo forzare la data su POSIXct per allinearla correttamente: as.POSIXct(as.Date(c("2016-12-01","2017-02-01")))
Jthorpe

Grazie Jthorpe .. questa è l'unica versione che ha funzionato per me
ColorStatistics

2

as.numeric funziona per me

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

output del codice

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.