web-dev-qa-db-fra.com

Boxplot affiche la valeur de la moyenne

Dans cette boîte à moustaches, nous pouvons voir la moyenne, mais comment pouvons-nous aussi avoir la valeur numérique sur la parcelle pour chaque moyenne de chaque parcelle?

 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)
48
user2354885

Tout d’abord, vous pouvez calculer les moyennes de groupe avec aggregate:

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

Cet ensemble de données peut être utilisé avec 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))

Ici, + 0.08 est utilisé pour placer l’étiquette au-dessus du point représentant la moyenne.

enter image description here


Une version alternative sans 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)

 enter image description here

66
Sven Hohenstein

Vous pouvez utiliser la valeur de sortie de 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)))
20
user3749036

Vous pouvez également utiliser une fonction dans stat_summary pour calculer la moyenne et l'argument hjust pour placer le texte. Vous avez besoin d'une fonction supplémentaire mais pas de trame de données supplémentaire:

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)

enter image description here

11
mvogel

La voie Magrittr

Je sais qu’il existe déjà une réponse acceptée, mais je voulais montrer une façon simple de le faire en une seule commande à l’aide de magrittr package.

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

Ce code produira une boîte à moustaches avec des moyens imprimés sous forme de points et de valeurs:  boxplot with means

Je divise la commande sur plusieurs lignes pour pouvoir commenter le rôle de chaque partie, mais elle peut également être entrée en tant que doublure. Vous pouvez en apprendre plus à ce sujet dans mon Gist .

1
jena