问题描述
我用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"))