Как получить вертикальную geom_vline на оси X даты класса?

110

Несмотря на то, что я нашел сообщение Хэдли в группе 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
Можете ли вы добавить несколько строк вашего фрейма данных, чтобы мы могли попробовать ваш пример?
Сара Уэст

Ответы:

142

Попробуйте 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

rcs
источник
Я обнаружил, что as.numeric () довольно сложно найти! Спасибо.
arno_v 01
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 .. это единственная версия, которая у меня работала
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()

вывод кода

Эстебан М. Корреа
источник