Bagaimana cara mendapatkan geom_vline vertikal ke sumbu x tanggal kelas?

109

Meskipun saya menemukan postingan Hadley di grup google di POSIXctdan geom_vline, saya tidak dapat menyelesaikannya. Saya memiliki deret waktu dari dan ingin menggambar garis vertikal untuk tahun 1998, 2005, dan 2010 misalnya. Saya mencoba dengan sintaks ggplotdan qplot, tetapi saya tetap tidak melihat garis vertikal sama sekali atau garis vertikal digambar pada kisi vertikal pertama dan seluruh rangkaian bergeser agak aneh ke kanan.

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

Bidang tanggal saya memiliki format "1993-07-01" dan berkelas Date.

Matt Bannert
sumber
1
Dapatkah Anda menambahkan beberapa baris kerangka data Anda, sehingga kami dapat mencoba contoh Anda?
Sarah West

Jawaban:

141

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

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

Contoh tes sederhana:

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)

plot contoh geom_vline

rcs
sumber
Saya menemukan 'as.numeric ()' sebenarnya cukup sulit ditemukan! Terima kasih.
arno_v
3
Saya ingin tahu apakah geom_vline(aes(xintercept=as.numeric(x[c(13, 24)])), linetype=4, colour="black")akan lebih idiomatis, yaitu menggunakan aesdaripada tmp$.
David Arenburg
1
Solusi ini tidak lagi berfungsi. Kode menghasilkan `` Kesalahan: Mencoba membuat lapisan tanpa stat. Jalankan rlang::last_error()untuk melihat di mana kesalahan itu terjadi. ''
CoderGuy123
30

Anda juga dapat melakukannya geom_vline(xintercept = as.numeric(as.Date("2015-01-01")), linetype=4)jika Anda ingin garis tetap di tempatnya apakah tanggal Anda ada di baris ke-120 atau tidak.

D. Hadley
sumber
13
di komputer saya (Win10 dengan R 3.2.2 dan ggplot 1.0.1), saya harus memaksa tanggal ke POSIXct agar selaras dengan benar: as.POSIXct(as.Date(c("2016-12-01","2017-02-01")))
Jthorpe
Terima kasih Jthorpe .. ini adalah satu-satunya versi yang berfungsi untuk saya
ColorStatistics
2

as. numerik bekerja untuk saya

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

keluaran kode

Esteban M. Correa
sumber