所有
我有一张图表,其中包含2个直方图,其中我还绘制了代表第20,第40,第60和第80百分位数的线条,下面的代码再现了具有虚拟数据的类似图表
data <- rbind(data.frame(x=rnorm(1000,0,1),g="one"),data.frame(x=rnorm(1000,0.2,1.5),g="two"))
q1 = melt(ddply(melt(data,id.vars="g"),.(g),summarise,q20=quantile(value,.2,na.rm=T),
q40=quantile(value,.4,na.rm=T),q60=quantile(value,.6,na.rm=T),q80=quantile(value,.8,na.rm=T)))
ggplot(data,aes(x=x,fill=g))+
geom_vline(data=q1,aes(xintercept=value,group=variable),linetype=2,color="black")+
#stat_bin(aes(y=..count../sum(..count..)),binwidth=0.1,alpha=0.4,geom="bar")+
geom_histogram(aes(y=..count../sum(..count..)),alpha=0.75,binwidth=0.1)+facet_grid(g~.)+theme_bw()+coord_cartesian(xlim=c(-3,3))
我想在第40行和第60行之间添加阴影区域(可能是灰色)以显示中间的五分之一 - 我希望该区域是数据驱动的(我使用的是数据帧q1,这是数据派生的,这是可以接受,我只是不想手动输入值)
如何实现这一目标?我无法做到这一点
感谢所有帮助
答案 0 :(得分:-1)
经过更多实验,我能够使用以下代码解决它
在某种程度上欺骗geom_rect的原因是它想要一个x变量(所以我在q上重命名为q40)。我不知道为什么ggplot不喜欢xmin = q40,但它喜欢xmax = q60
data <- rbind(data.frame(x=rnorm(1000,0,1),g="one"),data.frame(x=rnorm(1000,0.2,1.5),g="two"))
q = ddply(melt(data,id.vars="g"),.(g),summarise,q20=quantile(value,.2,na.rm=T),
q40=quantile(value,.4,na.rm=T),q60=quantile(value,.6,na.rm=T),q80=quantile(value,.8,na.rm=T))
q1 = melt(q)
names(q)[3] = 'x'
ch <- ggplot(data,aes(x=x,fill=g))+
geom_vline(data=q1,aes(xintercept=value,group=variable),linetype=2,color="black")+
geom_histogram(aes(y=..density..),alpha=0.75,binwidth=0.1)+facet_grid(g~.)+theme_bw()+coord_cartesian(xlim=c(-3,3))+
coord_cartesian(ylim=c(0,0.5))++geom_rect(data=q,aes(xmin=x,xmax=x1,ymin=0,ymax=.5,group=g),fill="gray",alpha=0.1)
ch