2017-09-19 2 views
0

Ich habe eine Datenmenge, die wie folgt aussieht:Stacked BarPlot für ein 2x2x2 Design in ggplot2 in R

conifer.abundance <- c(6,7,8,2,3,4,5,1,7,8,9,8,7,6,5,1) 
lily.abundance <- c(5,5,5,5,4,4,4,4,6,7,8,2,3,4,5,1) 
type <- c("Control","Control","Control","Control","Control","Control","Control","Control","Treatment","Treatment","Treatment","Treatment","Treatment","Treatment","Treatment","Treatment") 
class <- c("City","Rural","City","Rural","City","Rural","City","Rural","City","Rural","City","Rural","City","Rural","City","Rural") 
climate <- c("wet","wet","dry","dry","wet","wet","dry","dry","wet","wet","dry","dry","wet","wet","dry","dry") 
all.abundance <- conifer.abundance + lily.abundance 
dat88 <- data.frame(climate,type,class,conifer.abundance, lily.abundance,all.abundance) 

Dies ist ein 2x2x2-Design. Ich will so plotplots zeichnen, dass das Mittel aller Überschüsse als Summe der mittleren Nadelbäume und der lilienartigen Überfülle (gestapelt) dargestellt wird, und es hat eine eigene Legende. Ich habe versucht, this Code zu folgen, aber es scheint wie es mit Füllung, um die Bars zu stapeln, aber ich muss es für einen anderen Zweck hier verwenden. Angenommen, ich habe noch mehrere Datenpunkte, würde ich auch ein bootstrapped Konfidenzintervall (wie unten) plotten müssen. Irgendwelche Vorschläge? Hier ist mein aktueller Code zum Zeichnen der obigen Grafik.

pd <- position_dodge(0.82) 
    ggplot(dat88, aes(x=class, y=all.abundance, fill = climate)) + 
    theme_bw() + 
    stat_summary(geom="bar", fun.y=mean, position = "dodge") + 
    stat_summary(geom="errorbar", fun.data=mean_cl_boot,position = pd) + 
    ylab("Total Abundance") + 
    facet_grid(~type) 

Bitte beachten Sie, dass ich den Datensatz geringfügig geändert habe, um ein biologisch passenderes Szenario darzustellen.

+0

Ich bin nicht sicher, ob ich die aktualisierten Anforderungen verstehen. Wenn Sie den bootstrapped Mittelwert gegen die y-Achse plotten wollen, macht es noch Sinn, die totale Häufigkeit dort zu plotten? Oder meinst du die Summe von * durchschnittlicher * Abundanz für Nadelbäume & * durchschnittliche * Abundanz für Lilie? –

+0

Sie haben Recht. Etwas von durchschnittlicher Fülle von confiers und Lilie, macht mehr Sinn. – Ash

Antwort

2

Wenn Sie die Höhenwerte für weibliche & männlich stapeln möchten, müssen Sie sie in eine einzige Variable schmelzen/sammeln.

Die folgenden zwei Methoden zum Manipulieren des Datenrahmens sind äquivalent. Hängt davon ab, welche Pakete Sie besser vertraut mit sind:

# data.table package 
dat2 <- data.table::melt(dat, measure.vars = c("male.height", "female.height"), 
         variable.name = "Gender", value.name = "height") 

# tidyr package 
dat3 <- tidyr::gather(dat, key = Gender, value = height, 
         male.height, female.height, factor_key = TRUE) 

> all.equal(dat2, dat3) 
[1] TRUE 

Da dies ein 2 x 2 x 2 Design, habe ich eine Dimension facet_grid beide Arten und Arten zu zeigen. Wenn das nicht benötigt wird, kehrt einfach zu facet_grid(~type):

ggplot(dat2, 
     aes(x = class, y = height, fill = Gender)) + 
    geom_col() + 
    ylab("Total Height") + 
    facet_grid(species~type) + 
    scale_fill_discrete(breaks = c("female.height", "male.height"), 
         labels = c("female", "male")) 

facet plot

+0

Stellen Sie sich vor, ich habe mehrere Beispiele wie diese und ich möchte auch das Bootstrap CI auf der mittleren Gesamthöhe darstellen. Wie kann ich das mit diesem Code machen? Ich weiß, dass es in diesem Beispiel keinen biologischen Sinn macht, totale Höhe einzunehmen und dann einen Mittelwert zu nehmen ... aber ich versuche nur, eine anständige Erweiterung dessen, was ich habe, zu liefern. – Ash

+0

Können Sie ein umfangreicheres Datensample hinzufügen? Gegenwärtig gibt es für jede Kombination von Faktoren genau einen Datenpunkt, so dass es schwierig ist, die Motivation zu verstehen. –

+0

Ich habe meine Frage aktualisiert – Ash