箱线图显示平均值


71

在这个箱线图中,我们可以看到均值,但是对于每个箱线图的每个均值,我们又如何在图中得到数值呢?

 ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) + geom_boxplot() +
     stat_summary(fun.y=mean, colour="darkred", geom="point", 
                           shape=18, size=3,show_guide = FALSE)
r  ggplot2 

7
+1是简短的,独立的,可复制的示例。
西蒙·奥汉隆

Answers:


95

首先,您可以使用来计算组均值aggregate

means <- aggregate(weight ~  group, PlantGrowth, mean)

该数据集可用于geom_text

library(ggplot2)
ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) + geom_boxplot() +
  stat_summary(fun.y=mean, colour="darkred", geom="point", 
               shape=18, size=3,show_guide = FALSE) + 
  geom_text(data = means, aes(label = weight, y = weight + 0.08))

在此,+ 0.08用于将标签放置在表示平均值的点上方。

在此处输入图片说明


没有ggplot2以下内容的替代版本:

means <- aggregate(weight ~  group, PlantGrowth, mean)

boxplot(weight ~ group, PlantGrowth)
points(1:3, means$weight, col = "red")
text(1:3, means$weight + 0.08, labels = means$weight)

在此处输入图片说明


+1-我刚刚解决了这个问题,然后来更新我的答案和BAM!。做得好。
西蒙·奥汉隆

如何减少文字大小?
Martin Velez 2014年

另外,如何限制小数位数?
Martin Velez

2
@MartinVelez例如,geom_text(data = means, aes(label = round(weight, 1), y = weight + 0.08), size = 3)创建带有1个小数位的较小文本。
Sven Hohenstein

1
@mad尝试将参数添加position = position_dodge(width = 3/4)stat_summary
Sven Hohenstein'3

31

您可以使用以下输出值 stat_summary()

ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) 
+ geom_boxplot() 
+ stat_summary(fun.y=mean, colour="darkred", geom="point", hape=18, size=3,show_guide = FALSE)
+ stat_summary(fun.y=mean, colour="red", geom="text", show_guide = FALSE, 
               vjust=-0.7, aes( label=round(..y.., digits=1)))

1
我还想在方框图中添加均值。因此,我通过添加stat_summary()&来修正箱形图代码,fill=x但得到以下错误:Error: Unknown parameters: hape In addition: Warning message:show_guide has been deprecated. Please use show.legend instead. 您的代码有什么问题?
洛基

17

您还可以在stat_summary中使用一个函数来计算均值,并使用hjust参数来放置文本,您需要一个附加函数,但不需要附加数据框:

fun_mean <- function(x){
  return(data.frame(y=mean(x),label=mean(x,na.rm=T)))}


ggplot(PlantGrowth,aes(x=group,y=weight)) +
geom_boxplot(aes(fill=group)) +
stat_summary(fun.y = mean, geom="point",colour="darkred", size=3) +
stat_summary(fun.data = fun_mean, geom="text", vjust=-0.7)

在此处输入图片说明


5

马格利特方式

我知道已经有一个可接受的答案,但是我想展示一种很酷的方法,借助magrittr在单个命令中完成它包。

PlantGrowth %$% # open dataset and make colnames accessible with '$'
split(weight,group) %T>% # split by group and side-pipe it into boxplot
boxplot %>% # plot
lapply(mean) %>% # data from split can still be used thanks to side-pipe '%T>%'
unlist %T>% # convert to atomic and side-pipe it to points
points(pch=18)  %>% # add points for means to the boxplot
text(x=.+0.06,labels=.) # use the values to print text

此代码将产生一个箱形图,其均值打印为点和值: 带均值的箱线图

我将命令拆分为多行,以便可以注释每个部分的功能,但也可以将其作为一个单行输入。您可以在我的要点上了解更多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.