使用ggplot2将平均值添加到R中的分组箱图中

问题描述

我用ggplot2在R中创建了一个分组箱形图。但是,当我要添加平均值时,点会出现在一组中的两个框之间。如何更改它,使点位于每个框内?

这是我的代码

ggplot(results,aes(x=treatment,y=effect,fill=sex)) + 
  geom_Boxplot() +
  stat_summary(fun.y=mean,geom="point",shape=20,size=3,color="red")`

解决方法

在大多数情况下,您将无法将这些点放置在每个分组框中,因为它们通过轴相互重叠。一种替代方法是使用facet_wrap

这里是一个iris数据的例子:

ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,fill=Species)) + 
  geom_point(aes(color = Species),shape = 20,size = 3) +
  geom_boxplot(alpha = 0.8) +
  facet_wrap(~Species)

如果您不希望点的颜色与箱形图的颜色相同,则必须从aes内的geom_point中删除分组变量。同样,以iris为例,

ggplot(iris,fill=Species)) + 
  geom_boxplot(alpha = 0.8) +
  geom_point(shape = 20,size = 3,color = 'red') +
  facet_wrap(~Species)

请注意,ggplot2包是分层工作的。因此,如果在geom_point层之后添加geom_boxplot层,则这些点将位于箱线图的顶部。如果您在geom_point层之前添加geom_boxplot层,则这些点将在背景中。

编辑: 如果要在方框图中添加一个点以表示均值,则可以执行以下操作:

iris %>%
  group_by(Species) %>%
  mutate(mean.y = mean(Sepal.Width),mean.x = mean(Sepal.Length)) %>%
  ggplot(aes(x=Sepal.Length,fill=Species)) + 
  geom_boxplot(alpha = 0.8) +
  geom_point(aes(y = mean.y,x = mean.x),color = 'red')

但是请注意,可能需要在x轴上进行一些校准才能使其完全位于每个框的中间。

,

您可以使用position_dodge2。由于点和箱形图的宽度不同,因此您需要使用width参数反复试验以使点居中。

ggplot(mtcars,aes(x=factor(gear),y=hp,fill=factor(vs))) +
geom_boxplot() +
stat_summary(fun.y=mean,geom="point",shape=20,size=3,color="red",position = position_dodge2(width = 0.75,preserve = "single"))

enter image description here