ggplot2 - 在x轴上添加日期的水平线到刻面图

时间:2014-12-14 21:15:39

标签: r ggplot2

我正在尝试在ggplot2的刻面图中添加零线,并在x轴上添加日期。问题是我还要添加多边形来表示某些时间跨度,因此我必须将单独的data.frames传递给单独的geoms,这会产生一些困难。

以下是连续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需要继承基础{{1}中提供的信息行。但是,如上所述,我必须提供单独的ggplot来创建点和阴影多边形。

如果x轴是连续的,可以使用data.frames并将值设置为geom_line来解决这个问题:

Inf

但是如果我将x轴切换到日期,那么我就无法使用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,因为x轴不再是连续的。

我可以将Error: Discrete value supplied to continuous scale的端点指定为日期:

geom_line

但现在这条线并没有延长情节的长度!

如何使用可与x轴和刻面上的日期一起使用的内容来重现类似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~.) 的输出?

1 个答案:

答案 0 :(得分:8)

你的问题实际上是完全不同的,也很容易解决。

由于yintercepthline的值与您的数据无关,而与用户指定的值无关,因此不应构成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