2013-03-27 9 views
14

ich eine grundlegende boxplot tue wo y=age und x=Patient groupsWie füge ich eine Anzahl von Beobachtungen pro Gruppe hinzu und benutze Gruppenmittel in ggplot2 boxplot?

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

Ich hatte gehofft, du mich mit ein paar Dinge helfen könnte:

1) Ist es möglich, eine Reihe von Beobachtungen pro Gruppe gehören vor jede Gruppe Boxplot (aber nicht auf der X-Achse, wo meine Gruppenlabels sind), ohne dies in Farbe zu tun :)? Ich habe versucht, mit:

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

wo CON die erste Gruppe und y = 60 ist ~ knapp über dem boxplot für diese Gruppe. Der Befehl hat jedoch nicht funktioniert. Ich nehme an, es hat etwas zu tun, dass es x als eine kontinuierliche statt als eine kategorische Variable liest.

2) Auch wenn es viele Fragen über die Verwendung des Mittelwerts anstelle des Median für die Boxplots gibt, habe ich noch keinen Code gefunden, der für mich funktioniert?

3) Gibt es eine Möglichkeit, den Mittelwert der Gruppenstatistik in den Boxplot aufzunehmen? Vielleicht unter Verwendung

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

, die jedoch nur einen Punkt enthält, wo der Mittelwert liegt. Oder auch mit

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

wo CON die erste Gruppe und y = 30 ist ~ die Gruppe Alter Mittelwert. Wissen, wie flexibel und reich ggplot2 Syntax ist, ich hatte gehofft, dass es eine elegantere Art der Verwendung der realen Statistik-Ausgabe ist als annotate.

Alle Vorschläge/Links würden sehr geschätzt werden!

Danke !!

+0

A boxplot hat normalerweise min, untere, mittlere und obere Quantile und schließlich einen Maximalwert. Sie haben bereits die .25, .5 und .75 Quantile. Ist das nicht informativ genug? – Arun

+0

Dies ist das Format, nach dem ich gefragt werde. – user1442363

Antwort

24

Ist das etwas, wonach Sie suchen? Mit stat_summary, wie gewünscht:

# 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") 

Schwarz Zahl ist die Anzahl der Beobachtungen ist rot Anzahl Mittelwert.joran Antwort zeigt Ihnen, wie die Zahlen setzen an der Spitze der Boxen enter image description here

Hut-Tipp: https://stackoverflow.com/a/3483657/1036500

+3

Für eine Variante dieser Antwort, die beinhaltet, wie man mit 'n = 11', etc. annotiert, siehe hier: http://Stackoverflow.com/a/15720769/1036500 – Ben

+0

was macht label = rownames (mtcars) in ggplot Befehl? – alily

3

Antwort auf das erste Problem. Um den Wert über dem Feld anzuzeigen, geben Sie x Werte als numerische Werte und nicht als Ebenennamen an. Um den Wert über dem ersten Wert darzustellen, geben Sie x=1 ein.

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

Hallo! Vielen Dank. Ich probierte ursprünglich beide numerisch/Level aus, aber aus irgendeinem Grund funktionierte nichts. Jetzt ist es gut, vielen Dank. – user1442363

+0

Der Kommentar-Befehl ist perfekt, um Positionierungsprobleme zu beheben! Vielen Dank – Mac

15

Ich denke, das ist, was Sie suchen vielleicht?

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

ich, dass ich den Median irrtümlich nur realisiert werden verwendet, wenn Sie über die mittlere gefragt wurden, aber Sie können natürlich unabhängig von Funktion für die middle ästhetischen Sie bitte verwenden.

+0

Einfach nur schön! – user1442363

+0

Sorry, eine letzte Frage. Wäre es möglich, die Reihenfolge der Gruppen zu ändern? Ich bin leider nicht an einer numerischen oder datengesteuerten Bestellung interessiert. Die einzige Möglichkeit, es zu tun, ist die Umcodierung der Gruppenvariablen. Ihre Hilfe wird sehr geschätzt! Danke noch einmal! – user1442363

+1

@ user1442363 Ja [Sie haben Recht] (http://stackoverflow.com/q/6867393/324364). – joran