Wie bekomme ich eine vertikale geom_vline zu einer x-Achse des Klassendatums?

109

Obwohl ich Hadleys Beitrag in der Google-Gruppe auf POSIXctund gefunden habe geom_vline, konnte ich ihn nicht fertigstellen. Ich habe eine Zeitreihe von und möchte zum Beispiel für die Jahre 1998, 2005 und 2010 eine vertikale Linie ziehen. Ich habe es mit ggplotund qplotSyntax versucht , aber ich sehe entweder überhaupt keine vertikale Linie oder die vertikale Linie wird beim allerersten vertikalen Raster gezeichnet und die gesamte Serie wird etwas seltsam nach rechts verschoben.

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

Mein Datumsfeld hat das Format "1993-07-01" und ist von Klasse Date.

Matt Bannert
quelle
1
Können Sie einige Zeilen Ihres Datenrahmens hinzufügen, damit wir Ihr Beispiel ausprobieren können?
Sarah West

Antworten:

141

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

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

Ein einfaches Testbeispiel:

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)

geom_vline Beispielplot

rcs
quelle
Ich fand das 'as.numeric ()' eigentlich ziemlich schwer zu finden! Vielen Dank.
arno_v
3
Ich frage mich, ob geom_vline(aes(xintercept=as.numeric(x[c(13, 24)])), linetype=4, colour="black")es idiomatischer wäre, dh aesstatt zu verwenden tmp$.
David Arenburg
1
Diese Lösung funktioniert nicht mehr. Code erzeugt `` `Fehler: Es wurde versucht, eine Ebene ohne Statistik zu erstellen. Führen Sie aus, um rlang::last_error()zu sehen, wo der Fehler aufgetreten
ist.``
30

Sie können dies auch tun, geom_vline(xintercept = as.numeric(as.Date("2015-01-01")), linetype=4)wenn die Linie an Ort und Stelle bleiben soll, unabhängig davon, ob sich Ihr Datum in der 120. Zeile befindet oder nicht.

D. Hadley
quelle
12
Auf meinem Computer (Win10 mit R 3.2.2 und ggplot 1.0.1) muss ich das Datum auf POSIXct zwingen, damit es richtig ausgerichtet wird: as.POSIXct(as.Date(c("2016-12-01","2017-02-01")))
Jthorpe
Vielen Dank, Jthorpe. Dies ist die einzige Version, die für mich funktioniert hat
ColorStatistics
1

as.numeric funktioniert bei mir

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

Code-Ausgabe

Esteban M. Correa
quelle