gpt4 book ai didi

r - ggplot2-将水平线添加到带有x轴日期的多面图

转载 作者:行者123 更新时间:2023-12-04 04:05:10 25 4
gpt4 key购买 nike

我正在尝试向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需要继承 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~.)

但是,如果我将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~.)

类似地,如上所述使用 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~.)

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

如何使用将在x轴和构面上的日期有效的东西来重现类似 geom_vline的输出?

最佳答案

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

由于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~.)

关于r - ggplot2-将水平线添加到带有x轴日期的多面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27474201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com