在r中选择区域的双向密度图与单向密度图相结合

数据
种子集(123)
xvar<-c(rnorm(1000,50,30),rnorm(1000,40,10),rnorm(1000,70,10))
伊瓦尔<-xvar+rnorm(长度(xvar),0,20)
myd<-data.frame(xvar、yvar)
#xvar的密度图
上限P=80#上限截止值
lowerp=30#下截止点
x<-myd$xvar
地块(密度(x))
丹斯<-密度(x)
x11<-最小值(其中(密度$x<=lowerp))
x12<-最大值(其中(密度$x<=较低))
x21<-最小值(密度$x>上限))
x22<-最大值(密度$x>上限))
有(密度,多边形(x=c(x[c(x11,x11:x12,x12)]),
y=c(0,y[x11:x12],0),col=“绿色”))
带(凹面,多边形(x=c(x[c(x21,x21:x22,x22)]),
y=c(0,y[x21:x22],0),col=“红色”))
abline(v=c(平均值(x)),lwd=2,lty=2,col=“红色”)
#yvar密度图
上限P=70#上限截止
lowerp=30#下截止点
x<-myd$yvar
地块(密度(x))
丹斯<-密度(x)
x11<-最小值(其中(密度$x<=lowerp))
x12<-最大值(其中(密度$x<=较低))
x21<-最小值(密度$x>上限))
x22<-最大值(密度$x>上限))
有(密度,多边形(x=c(x[c(x11,x11:x12,x12)]),
y=c(0,y[x11:x12],0),col=“绿色”))
带(凹面,多边形(x=c(x[c(x21,x21:x22,x22)]),
y=c(0,y[x21:x22],0),col=“红色”))
abline(v=c(平均值(x)),lwd=2,lty=2,col=“红色”)

我需要绘制双向密度图,我不确定是否有比以下更好的方法:

ggplot(myd,aes(x=xvar,y=yvar))+
统计密度2D(aes(填充=…水平…),geom=“多边形”)+
比例填充梯度(低=“蓝色”,高=“绿色”)+主题填充宽度()

我想将所有三种类型合并为一种(我不知道是否可以在ggplot中创建双向绘图),对于解决方案be绘图是在ggplot中还是在base中或混合中没有优先权。考虑到R的健壮性,我希望这是一个可行的项目。我个人更喜欢ggplot2

注:此图中的下部阴影不正确,在xvar和yvar图中,红色应始终较低,绿色应始终较高,对应于xy密度图中的阴影区域

编辑:图表上的最终预期(感谢赛斯和乔恩给出了非常接近的答案)
(1) 删除空间和轴刻度标签等以使其紧凑
(2) 对齐轴网,以便中间的打印记号和轴网应与侧面记号和标签对齐,并且打印的大小看起来相同。

以下是将多个绘图与路线相结合的示例:

库(ggplot2)
图书馆(网格)
种子集(123)
xvar<-c(rnorm(100,50,30),rnorm(100,40,10),rnorm(100,70,10))
伊瓦尔<-xvar+rnorm(长度(xvar),0,20)
myd<-data.frame(xvar、yvar)
p1<-ggplot(myd,aes(x=xvar,y=yvar))+
统计密度2D(aes(填充=…水平…),geom=“多边形”)+
笛卡尔坐标(c(0150),c(0150))+
选项(legend.position=“无”)
p2<-ggplot(myd,aes(x=xvar))+统计密度()+
坐标笛卡尔(c(0,150))
p3<-ggplot(myd,aes(x=yvar))+统计密度()
坐标翻转(c(0,150))
gt<-ggplot_gtable(ggplot_构建(p1))
gt2<-ggplot_gtable(ggplot_构建(p2))
gt3<-ggplot_gtable(ggplot_构建(p3))
gt1<-ggplot2:::gtable_add_cols(gt,单位(0.3,“空”),位置=-1)
gt1<-ggplot2:::gtable_add_行(gt1,单位(0.3,“空”),位置=0)
gt1<-ggplot2:::gtable_add_grob(gt1、gt2$grob[[which(gt2$layout$name==“panel”)],
1, 4, 1, 4)
gt1<-ggplot2:::gtable_add_grob(gt1、gt2$grob[[其中(gt2$layout$name==“axis-l”)],
1,3,1,3,clip=“off”)
gt1<-ggplot2:::gtable_add_grob(gt1、gt3$grobs[[其中(gt3$layout$name==“panel”)],
4, 6, 4, 6)
gt1<-ggplot2:::gtable_add_grob(gt1、gt3$grob[[其中(gt3$layout$name==“axis-b”)],
5,6,5,6,clip=“off”)
grid.newpage()
网格绘制(gt1)

请注意,这适用于gglot2 0.9.1,在未来的版本中,您可以更轻松地执行此操作

最后

您可以通过以下方式实现:

库(ggplot2)
图书馆(网格)
种子集(123)
xvar<-c(rnorm(100,50,30),rnorm(100,40,10),rnorm(100,70,10))
伊瓦尔<-xvar+rnorm(长度(xvar),0,20)
myd<-data.frame(xvar、yvar)
p1<-ggplot(myd,aes(x=xvar,y=yvar))+
统计密度2D(aes(填充=…水平…),geom=“多边形”)+
几何多边形(aes(x,y),
data.frame(x=c(-Inf,-Inf,30,30),y=c(-Inf,30,30,-Inf)),
alpha=0.5,颜色=NA,填充=“红色”)+
几何多边形(aes(x,y),
data.frame(x=c(Inf,Inf,80,80),y=c(Inf,80,80,Inf)),
alpha=0.5,颜色=NA,填充=“绿色”)+
笛卡尔坐标(c(0,120),c(0,120))+
选项(legend.position=“无”)
xd<-数据帧(密度(myd$xvar)[c(“x”,“y”)]
p2<-ggplot(xd,aes(x,y))+
几何面积(数据=子集(xd,x<30),fill=“红色”)+
几何图形面积(数据=子集(xd,x>80),fill=“绿色”)+
geom_线()+
坐标笛卡尔(c(0,120))
yd<-数据帧(密度(myd$yvar)[c(“x”,“y”)])
p3<-ggplot(yd,aes(x,y))+
几何面积(数据=子集(yd,x<30),填充=“红色”)+
几何图形面积(数据=子集(yd,x>80),填充=“绿色”)+
geom_线()+
坐标翻转(c(0,120))
gt<-ggplot_gtable(ggplot_构建(p1))
gt2<-ggplot_gtable(ggplot_构建(p2))
gt3<-ggplot_gtable(ggplot_构建(p3))
gt1<-ggplot2:::gtable_add_cols(gt,单位(0.3,“空”),位置=-1)
gt1<-ggplot2:::gtable_add_行(gt1,单位(0.3,“空”),位置=0)
gt1<-ggplot2:::gtable_add_grob(gt1、gt2$grob[[which(gt2$layout$name==“panel”)],
1, 4, 1, 4)
gt1<-ggplot2:::gtable_add_grob(gt1、gt2$grob[[其中(gt2$layout$name==“axis-l”)],
1,3,1,3,clip=“off”)
gt1<-ggplot2:::gtable_add_grob(gt1、gt3$grobs[[其中(gt3$layout$name==“panel”)],
4, 6, 4, 6)
gt1<-ggplot2:::gtable_add_grob(gt1、gt3$grob[[其中(gt3$layout$name==“axis-b”)],
5,6,5,6,clip=“off”)
grid.newpage()
网格绘制(gt1)

发表评论