我正在尝试在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~.)
的输出?
答案 0 :(得分: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~.)