web-dev-qa-db-fra.com

Comment ajouter un certain nombre d'observations par groupe et utiliser la moyenne du groupe dans le boxplot ggplot2?

Je fais un boxplot de base où y=age et x=Patient groups

age <- ggplot(data, aes(factor(group2), age))  + ylim(15, 80) 
age + geom_boxplot(fill = "grey80", colour = "#3366FF")

J'espérais que vous pourriez m'aider avec quelques choses:

1) Est-il possible d'inclure un certain nombre d'observations par groupe au-dessus de chaque boîte à moustaches de groupe (mais PAS sur l'axe X où se trouvent les étiquettes de mon groupe) sans avoir à le faire dans Paint :)? J'ai essayé d'utiliser:

age + annotate("text", x = "CON", y = 60, label = "25")

CON est le 1er groupe et y = 60 est ~ juste au-dessus du boxplot pour ce groupe. Cependant, la commande n'a pas fonctionné. Je suppose qu'il a quelque chose à faire qu'il lit x comme une variable continue plutôt que catégorique.

2) Aussi, bien qu'il y ait beaucoup de questions sur l'utilisation de la moyenne plutôt que de la médiane pour les boxplots, je n'ai toujours pas trouvé de code qui fonctionne pour moi?

3) Sur le même sujet, existe-t-il un moyen d'inclure la statistique de groupe moyen dans le boxplot? Peut-être en utilisant

age + stat_summary(fun.y=mean, colour="red", geom="point")

qui ne comprend cependant qu'un point d'où se situe la moyenne. Ou encore en utilisant

age + annotate("text", x = "CON", y = 30, label = "30")

CON est le 1er groupe et y = 30 est ~ la moyenne d'âge du groupe. Savoir combien flexible et riche ggplot2 la syntaxe est que j'espérais qu'il existe une manière plus élégante d'utiliser la sortie réelle des statistiques plutôt que annotate.

Toutes suggestions/liens seraient très appréciés!

Merci!!

21
user1442363

Est-ce quelque chose comme ce que vous recherchez? Avec stat_summary, comme demandé:

# function for number of observations 
give.n <- function(x){
  return(c(y = median(x)*1.05, label = length(x))) 
  # experiment with the multiplier to find the perfect position
}

# function for mean labels
mean.n <- function(x){
  return(c(y = median(x)*0.97, label = round(mean(x),2))) 
  # experiment with the multiplier to find the perfect position
}

# plot
ggplot(mtcars, aes(factor(cyl), mpg, label=rownames(mtcars))) +
  geom_boxplot(fill = "grey80", colour = "#3366FF") +
  stat_summary(fun.data = give.n, geom = "text", fun.y = median) +
  stat_summary(fun.data = mean.n, geom = "text", fun.y = mean, colour = "red")

Le nombre noir est le nombre d'observations, le nombre rouge est la valeur moyenne. la réponse de joran vous montre comment mettre les chiffres en haut des cases enter image description here

pointe du chapeau: https://stackoverflow.com/a/3483657/10365

33
Ben

Je pense que c'est ce que vous cherchez peut-être?

myboxplot <- ddply(mtcars,
                    .(cyl),
                    summarise,
                    min = min(mpg),
                    q1 = quantile(mpg,0.25),
                    med = median(mpg),
                    q3 = quantile(mpg,0.75),
                    max= max(mpg),
                    lab = length(cyl))
ggplot(myboxplot, aes(x = factor(cyl))) + 
    geom_boxplot(aes(lower = q1, upper = q3, middle = med, ymin = min, ymax = max), stat = "identity") + 
    geom_text(aes(y = max,label = lab),vjust = 0)

enter image description here

Je viens de réaliser que j'ai utilisé par erreur la médiane lorsque vous avez demandé la moyenne, mais vous pouvez évidemment utiliser n'importe quelle fonction pour l'esthétique middle qui vous plaît.

18
joran

Réponse au premier problème. Pour afficher la valeur au-dessus de la boîte, vous devez fournir des valeurs x sous forme numérique et non sous forme de noms de niveau. Donc, pour tracer la valeur au-dessus de la première valeur, donnez x=1.

data(ToothGrowth)
ggplot(ToothGrowth,aes(supp,len))+geom_boxplot()+
   annotate("text",x=1,y=32,label=30)
4
Didzis Elferts