2

我想要一个箱线图,在直方图下方显示相同的分布。下面的代码几乎可以工作,但coord_flip()正在应用于所有层,而不仅仅是geom_boxplot层。

plot1<-ggplot(newdatahistogram, aes_string(x=newdatahistogram[RawLocation])) + 
          xlab(GGVar) + ylab("Proportion of Instances") + 
          geom_histogram(aes(y=..density..), binwidth=1, colour="black", fill="white",origin=-0.5) + 
          scale_x_continuous(limits=c(-3,6), breaks=seq(0,5,by=1), expand=c(.01,0)) +
          geom_boxplot(aes_string(x=-1, y=newdatahistogram[RawLocation])) + coord_flip()

如何应用coord_flip()到单层?

谢谢!

4

2 回答 2

2

我得到了一些技巧。

plot1 <- ggplot(newdatahistogram, aes_string(x=newdatahistogram[RawLocation], fill=(newdatahistogram[,"PQ"]))) + 
  xlab(GGVar) + ylab("Proportion of Observation") + 
  geom_histogram(aes(y=..density..), binwidth=1, colour="black", origin=-0.5) +
  scale_x_continuous(limits=c(-1,6), breaks=seq(0,5,by=1), expand=c(.01,0)) +
  scale_y_continuous(limits=c(-.2,1), breaks=seq(0,1,by=.2))
  theme(plot.margin = unit(c(0,0,0,0), "cm"))      

plot_box <- ggplot(newdatahistogram) +
  geom_boxplot(aes_string(x=1, y=newdatahistogram[RawLocation])) + 
  scale_y_continuous(breaks=(0:5), labels=NULL, limits=c(-1,6), expand=c(.0,-.03)) + 
  scale_x_continuous(breaks=NULL) + xlab(NULL) + ylab(NULL) +
  coord_flip() + theme_bw() +  
  theme(plot.margin = unit(c(0,0,.0,0), "cm"),
        line=element_blank(),text=element_blank(),
        axis.line = element_blank(),title=element_blank(), panel.border=theme_blank())

PB = ggplotGrob(plot_box)
plot1 <- plot1 + annotation_custom(grob=PB, xmin=-1.01, xmax=5.95, ymin=-.3,ymax=0)

这会将旋转的箱线图保存为 grob 对象,并将其插入到直方图下方的图中。

我需要稍微玩一下扩展元素才能让天平对齐,但它确实有效!

说真的,我认为ggplot应该有一个没有cord_flip()的水平箱线图......我试图编辑箱线图代码,但这对我来说太难了!

试图发布图像,但没有足够的声誉

于 2013-09-09T03:33:41.037 回答
1

你不能:coord_flip总是作用于所有层。但是,您确实有两种选择:

  • 这里的解决方案展示了如何使用grid.arrange()添加边缘直方图。(问题中的评论还链接到一个很好的base-R方法来做同样的事情)
  • 您可以使用绘图四个侧面的地毯图来指示密度plot1 + geom_rug(sides='r')

    ggplot(mpg, aes(x=class, y=cty)) + geom_boxplot() + geom_rug(sides="r")

在此处输入图像描述

于 2013-09-08T00:05:08.823 回答