2014-12-14 1 views
9

Я пытаюсь добавить нулевую линию к граничному графику в ggplot2 с датами на оси х. Проблема в том, что я также добавляю многоугольники для представления определенных промежутков времени, поэтому я должен передать отдельный data.frames, чтобы отделить geoms, что дает некоторые трудности.ggplot2 - добавить горизонтальную линию к граненому графику с датами по оси x

Вот пример с непрерывной осью х:

ggplot()+ 
    geom_rect(data=data.frame(from=c(1,3),to=c(2,4)),aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+ 
    geom_point(data=data.frame(x=c(1,2,3,4,5,6),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+ 
    facet_grid(type~.) 

Если я пытаюсь добавить горизонтальную линию с geom_hline я получаю сообщение об ошибке: Error in if (empty(data)) { : missing value where TRUE/FALSE needed, которую я беру, потому что geom_vline потребности унаследовать информация предоставляется в основании ggplot линия. Однако, как отмечено выше, я должен предоставить отдельный data.frames для создания точек и затененных многоугольников.

Это можно обойти, если ось х непрерывна с помощью geom_line и установки значения Inf:

ggplot()+ 
    geom_line(data=data.frame(x=c(-Inf,Inf),y=0),aes(x=x,y=y),col="grey50",lwd=1)+ 
    geom_rect(data=data.frame(from=c(1,3),to=c(2,4)),aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+ 
    geom_point(data=data.frame(x=c(1,2,3,4,5,6),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+ 
    facet_grid(type~.) 

Но если переключить ось х к датам, то я не могу добавить горизонтальная линия с использованием geom_hline (по тем же причинам, что и выше):

dates=c("2001-01-1","2002-01-01","2003-01-01","2004-01-01","2005-01-01","2006-01-01") 

ggplot()+ 
    geom_hline(aes(yintercept=0))+ 
    geom_rect(data=data.frame(from=c(as.Date("2001-01-1"),as.Date("2003-01-01")), 
          to=c(as.Date("2002-01-1"),as.Date("2004-01-01"))), 
      aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+ 
    geom_point(data=data.frame(x=as.Date(dates),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+ 
    facet_grid(type~.) 

Аналогично, используя geom_line как описано выше, не приводит к ошибке: Error: Discrete value supplied to continuous scale потому, что ось х больше не непрерывно.

можно указать конечные точки geom_line как даты:

ggplot()+ 
    geom_line(data=data.frame(x=c(as.Date("2001-01-01"),as.Date("2006-01-01")),y=0),aes(x=x,y=y),col="grey50",lwd=1)+ 
    geom_rect(data=data.frame(from=c(as.Date("2001-01-1"),as.Date("2003-01-01")), 
          to=c(as.Date("2002-01-1"),as.Date("2004-01-01"))), 
      aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+ 
    geom_point(data=data.frame(x=as.Date(dates),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+ 
    facet_grid(type~.) 

Но теперь линия не распространяется на длину участка!

Как я могу воспроизвести вывод geom_vline, используя что-то, что будет работать с датами на оси х и грани?

ответ

8

Ваша проблема на самом деле совсем другая, а также очень легко исправить.

Поскольку значение yintercept в вашем hline не связано с вашими данными, но с указанным пользователем значением, это не должно составлять часть aes().

Вместо этого спецификация просто:

geom_hline(yintercept=0) + 

Попробуйте это:

dates=c("2001-01-1","2002-01-01","2003-01-01","2004-01-01","2005-01-01","2006-01-01") 

ggplot()+ 
    geom_rect(data=data.frame(from=c(as.Date("2001-01-1"),as.Date("2003-01-01")), 
          to=c(as.Date("2002-01-1"),as.Date("2004-01-01"))), 
      aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1) + 
    geom_point(data=data.frame(x=as.Date(dates),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)), 
      aes(x=x,y=y)) + 
    geom_hline(yintercept=0) + 
    facet_grid(type~.) 

enter image description here

+1

Сын ружьем. Я должен тебе кока-колу! – jslefche

Смежные вопросы