2016-05-19 10 views
1

Ich möchte die Anzahl der Beobachtungen unter jedem Boxplot hinzufügen (wie in der Abbildung - keine Notwendigkeit für das rote Quadrat). :) Allerdings kann ich diese Art von Boxplot nicht annotieren (siehe Abbildung unten).gruppierten Boxplot in ggplot annotieren - Anzahl der Beobachtungen unter boxplot hinzufügen

Weiß jemand wie man es macht?

Dies ist der Code, den ich verwendet habe, um diese Figur zu plotten.

ggplot(data=MIOT1, aes(stage, time, fill=resp)) + 
geom_boxplot(color= "black", lwd=0.3) + 
stat_summary(fun.y=mean, geom="point", shape=0, size=1, colour="black", position=position_dodge(width=0.75)) + 
scale_fill_manual(values=c("grey25", "grey50", "grey67")) + 
annotation_custom(mygrobA) + 
scale_y_continuous(limits=c(-10,124)) + 
theme(panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(), 
    strip.background = element_rect(colour="black"), 
    panel.border = element_rect(colour = "black", fill="transparent")) + 
xlab(bquote(' ')) + 
ylab(bquote('Minimum Consecutive Time (s)')) + 
labs(title="SATIATION\n") + 
theme(axis.title.y = element_text(colour="black",size=10,face="bold"), 
    axis.text.x = element_text(colour="black",size=8, face="plain"), 
    axis.text.y = element_text(colour="black",size=8, face="plain"), 
    axis.title.x = element_text(colour="black",size=10,face="bold")) + 
theme(panel.background = element_rect(fill = "white")) + 
theme(plot.title = element_text(lineheight=.8, size=10, face="bold")) + 
theme(legend.title=element_blank(), legend.key = element_rect(fill = NA, colour = NA)) + 
theme(legend.position="none") + 
theme(legend.background = element_rect(fill=NA)) + 
theme(plot.margin = unit(c(.25,.25,.0,.0), "cm"))<i> 

Beispiel DATA MIOT1 ist eine numerische Variable (y-Achse), und ich bin die Prüfung zwei Gruppierungsfaktoren (Entwicklung Bühnen- x-Achse) und die Antwort (nicht mehr reagiert, an der Küste, Lagune).

So etwas wie

stage resp time 
pre  U  100 
pre  U  80 
pre  U  50 
pre  C  20 
flex  U  80 
flex  U  90 
flex  C  10 
flex  C  20 
post  U  40 
post  U  30 
post  U  60 
post  C  80 
post  C  100 
post  L  50 
post  L  40 

Vielen Dank! Pedro

+1

Bitte geben Sie uns einige Beispieldaten, die wir kann damit arbeiten. Im Moment haben wir keine Ahnung, was "MIOT1" ist, was es für uns schwierig macht, Ihr Problem zu replizieren. Ein 'dput (MIOT1)' wäre hilfreich. Weitere Informationen finden Sie unter http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

Ich habe jetzt ein Beispieldaten in der Frage hinzugefügt. Vielen Dank! –

Antwort

2

Hier ist ein einfaches Beispiel, wie es zu tun, die sich im internen mtcars Datenrahmen mit:

ggplot(mtcars, aes(factor(cyl), mpg)) + 
    geom_boxplot() + 
    geom_text(stat="count", aes(label=..count..), y=min(mtcars$mpg)- 0.6) 

In Ihrem Fall wird es so etwas wie

ggplot(data=MIOT1, aes(stage, time, fill=resp)) + 
    geom_boxplot(color= "black", lwd=0.3) + 
    geom_text(stat="count", aes(label=..count..), y=min(MIOT1$time)) 

, wo Sie sein Möglicherweise müssen Sie die Position der Textbeschriftungen y anpassen, und Sie müssen möglicherweise auch den Bereich der y-Achse anpassen, um Platz für die Beschriftungen zu schaffen.

UPDATE: Ich konnte den Fehler reproduzieren, den Sie gemeldet haben, aber ich bin mir nicht sicher, wie Sie es beheben können. Stattdessen können Sie die Daten vorab zusammenfassen und dann zum Plot hinzufügen. Hier ein Beispiel:

library(dplyr) 

# Get counts by desired grouping variables 
counts = mtcars %>% group_by(cyl, am) %>% tally 


ggplot(mtcars, aes(factor(cyl), mpg, fill=factor(am))) + 
    geom_boxplot(position=position_dodge(0.9)) + 
    geom_text(data=counts, aes(label=n, y=min(mtcars$mpg) - 0.6), 
     position=position_dodge(0.9)) 
+0

Vielen Dank für die Antwort eipi10. Ich bin fast da. Der Code, den Sie zur Verfügung gestellt haben, erlaubt mir jedoch, die Anzahl für jede Gruppe des Faktors "Entwicklungsstufe" (x-Achse) zu erhalten. Das bedeutet, dass ich 3 Zählungen habe. Ich möchte jedoch die Anzahl für jeden Boxplot, die 9 zählt. Nochmals vielen Dank. –

+0

eipi10 ... Ich habe gerade bemerkt, dass die 9 Zählungen alle da sind, aber sie sind in der Mitte in Blöcken von 3 überlagert. Ich habe versucht Position.dodge, aber es funktioniert nicht. Irgendwelche Vorschläge? –

+0

So etwas wie "position = position.dodge (0.5)" (verwende den gleichen Ausweichen-Betrag wie für die Boxplots). – eipi10

0

IN ZUSAMMENFASSUNG EIPI10 Antwort auf meine Frage:

Bibliothek (dplyr)

Erhalten Sie zählt nach gewünschten Gruppenvariablen

counts = mtcars %>% group_by(cyl, am) %>% tally 


ggplot(mtcars, aes(factor(cyl), mpg, fill=factor(am))) + 
geom_boxplot(position=position_dodge(0.9)) + 
geom_text(data=counts, aes(label=n, y=min(mtcars$mpg) - 0.6), position=position_dodge(0.9) 
Verwandte Themen