Boxplot zeigt den Wert des Mittelwerts

71

In diesem Boxplot können wir den Mittelwert sehen, aber wie können wir auch den Zahlenwert auf dem Plot für jeden Mittelwert jedes Boxplots haben?

 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)

quelle
7
+1 für ein kurzes, in sich geschlossenes, reproduzierbares Beispiel.
Simon O'Hanlon

Antworten:

95

Zunächst können Sie die Gruppenmittelwerte berechnen mit aggregate:

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

Dieser Datensatz kann verwendet werden mit 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))

Hier + 0.08wird die Beschriftung über dem Punkt platziert, der den Mittelwert darstellt.

Geben Sie hier die Bildbeschreibung ein


Eine alternative Version ohne 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)

Geben Sie hier die Bildbeschreibung ein

Sven Hohenstein
quelle
+1 - Ich hatte das gerade durchgearbeitet und kam, um meine Antwort und BAM! Zu aktualisieren. Gut gemacht.
Simon O'Hanlon
Wie können Sie die Größe des Textes verringern?
Martin Velez
Wie können Sie auch die Anzahl der Dezimalstellen begrenzen?
Martin Velez
2
@MartinVelez Erstellt beispielsweise geom_text(data = means, aes(label = round(weight, 1), y = weight + 0.08), size = 3)kleineren Text mit 1 Dezimalstelle.
Sven Hohenstein
1
@mad Versuchen Sie das Argument hinzufügen position = position_dodge(width = 3/4)zu stat_summary.
Sven Hohenstein
31

Sie können den Ausgabewert von verwenden 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)))
user3749036
quelle
1
Ich möchte auch Mittelwert in den Boxplots hinzufügen. Also habe ich den Box-Plot-Code geändert, indem ich stat_summary()& hinzugefügt habe, fill=xaber diesen Fehler erhalten habe: Error: Unknown parameters: hape In addition: Warning message:show_guide has been deprecated. Please use show.legend instead. Was ist in Ihrem Code falsch?
Rocky
17

Sie können auch eine Funktion in stat_summary verwenden, um den Mittelwert und das Argument hjust zu berechnen, um den Text zu platzieren. Sie benötigen eine zusätzliche Funktion, aber keinen zusätzlichen Datenrahmen:

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)

Geben Sie hier die Bildbeschreibung ein

mvogel
quelle
5

Der Magrittr-Weg

Ich weiß, dass es bereits eine akzeptierte Antwort gibt, aber ich wollte mit Hilfe des magrittr- Pakets einen coolen Weg zeigen, dies in einem einzigen Befehl zu tun .

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

Dieser Code erzeugt ein Boxplot mit Mitteln, die als Punkte und Werte gedruckt werden: Boxplot mit Mitteln

Ich habe den Befehl in mehrere Zeilen aufgeteilt, damit ich kommentieren kann, was jeder Teil tut, aber er kann auch als Oneliner eingegeben werden. Mehr dazu erfahren Sie in meinem Kern .

Jena
quelle