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

jsl*_*che 9 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~.)
Run Code Online (Sandbox Code Playgroud)

如果我尝试添加一条水平线,geom_hline我得到一个错误:Error in if (empty(data)) { : missing value where TRUE/FALSE needed我采取的是因为geom_vline需要继承基线中提供的信息ggplot.但是,如上所述,我必须单独提供data.frames以创建点和阴影多边形.

如果x轴是连续的,可以通过使用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~.)
Run Code Online (Sandbox Code Playgroud)

但是如果我将x轴切换到日期,那么我就无法使用水平线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~.)
Run Code Online (Sandbox Code Playgroud)

类似地,使用geom_line上述方法会产生错误:Error: Discrete value supplied to continuous scale因为x轴不再是连续的.

我可以指定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~.)
Run Code Online (Sandbox Code Playgroud)

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

如何geom_vline使用可以在x轴和刻面上使用日期的东西来重现类似输出?

And*_*rie 8

你的问题实际上是完全不同的,也很容易修复.

由于价值yintercept在你hline是不相关的数据,但用户指定的值,这不应该形成的部分aes().

相反,规范很简单:

geom_hline(yintercept=0) +
Run Code Online (Sandbox Code Playgroud)

试试这个:

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~.)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述