Як дістати вертикальну geom_vline до осі x дати класу?


109

Незважаючи на те, що я знайшов пост Хедлі в групі Google POSIXctі geom_vlineне зміг цього зробити. У мене є часовий ряд, і я хотів би провести вертикальну лінію, наприклад, для 1998, 2005 та 2010 років. Я спробував ggplotі qplotсинтаксис, але все-таки я взагалі не бачу вертикальної лінії, або вертикальна лінія намальована на першій вертикальній сітці, і вся серія зміщена дещо дивно вправо.

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

Моє поле дати має формат "1993-07-01" і є класним Date.


1
Чи можете ви додати кілька рядків вашого фрейму даних, щоб ми могли спробувати ваш приклад?
Сара Вест

Відповіді:


141

Спробуйте as.numeric(mydata$datefield[120]):

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

Простий тестовий приклад:

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


Я знайшов 'as.numeric ()' насправді досить важко знайти! Дякую.
arno_v

3
Цікаво, чи geom_vline(aes(xintercept=as.numeric(x[c(13, 24)])), linetype=4, colour="black")було б ідіоматичнішим, тобто використанням aesзамість tmp$.
Девід Аренбург

1
Це рішення більше не працює. Код створює `` `Помилка: спроба створити шар без стати. Запустіть, rlang::last_error()щоб побачити, де сталася помилка. ''
CoderGuy123

30

Ви також можете зробити це, geom_vline(xintercept = as.numeric(as.Date("2015-01-01")), linetype=4)якщо хочете, щоб лінія залишалася на місці, незалежно від того, чи є ваша дата в 120-му рядку.


13
на моїй машині (Win10 з R 3.2.2 та ggplot 1.0.1) я повинен примусити дату POSIXct, щоб зрівняти її: as.POSIXct(as.Date(c("2016-12-01","2017-02-01")))
Jthorpe

Дякую, Jthorpe .. це єдина версія, яка працювала на мене
ColorStatistics

2

as.numeric працює для мене

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

вихід коду

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.