2012-08-02 8 views
7

Arbeiten aus dem folgenden Datenrahmen:Zwei-Faktor-Balkendiagramm

> foo 
     species density day percent 
    1 species1 high 1 0.40 
    2 species1  low 1 0.20 
    3 species1 medium 1 0.40 
    4 species2 high 1 0.35 
    5 species2  low 1 0.10 
    6 species2 medium 1 0.55 
    7 species3 high 1 0.35 
    8 species3  low 1 0.20 
    9 species3 medium 1 0.45 
    10 species4 high 1 0.30 
    11 species4  low 1 0.20 
    12 species4 medium 1 0.50 
    13 species1 high 100 0.50 
    14 species1  low 100 0.40 
    15 species1 medium 100 0.10 
    16 species2 high 100 0.40 
    17 species2  low 100 0.05 
    18 species2 medium 100 0.55 
    19 species3 high 100 0.65 
    20 species3  low 100 0.05 
    21 species3 medium 100 0.30 
    22 species4 high 100 0.40 
    23 species4  low 100 0.20 
    24 species4 medium 100 0.40 

ich folgendes facettiertes Balkendiagramm erstellt habe:

require(ggplot2) 

foo$density<-factor(foo$density,levels=c('low','medium','high')) 

d <- ggplot(foo, aes(x=species, y=percent, fill=density)) + 
    geom_bar(aes(width=.65), stat="identity") + 
    facet_grid(. ~ day) 

enter image description here

Allerdings würde Ich mag diese fusionieren Graphen, um ein einzelnes Zwei-Faktoren-Balkendiagramm zu erstellen. Auf der x-Achse würde jeder Tag - 1 und 100 - nach Arten gruppiert werden. Irgendwelche Vorschläge, wie man das schafft?

Vielen Dank!

Antwort

4

Versuchen Sie dieses

foo$species_day <- with(data = foo, expr = paste(species, day)) 
d <-ggplot(foo, aes(x=species_day, y=percent, fill=density)) + 
     geom_bar(aes(width=.65), stat="identity") 

enter image description here Sie können die Ebenen neu ordnen, wenn Sie wollen.

+0

Oder Sie könnten "Tag" zu einem Faktor und Facette auf "Spezies" konvertieren ... – joran

+1

@joran Ich mag die Idee der Facettierung nach Arten, aber dann wird die Kennzeichnung der x-Achse ein Problem. Ich möchte, dass "Arten" das zentrale X-Achsen-Label (am unteren Rand des Diagramms) und "Tag" in jeder "Art" (auch unten) festgelegt werden. –

+0

@ MYaseen208 Danke für diesen Vorschlag- Ich mag, wie alles in einem einzigen Diagramm ist. Gibt es überhaupt mehr und weniger Platz zwischen Bars zu "Gruppe" nach Arten? –

1

Hier ist ein weiterer Ansatz, der @ Jorans Vorschlag zusammen mit Ihren Anforderungen enthält.

Ich habe day zu einem Faktor geändert, aber auch die Standard-X-Achsenbezeichnung in "Species" geändert. Da density eindeutig ein sequenzieller Faktor ist, verwende ich eine sequentielle Farbskala von Color Brewer (http://colorbrewer2.org/). Sie können mit Farbskalen experimentieren, indem Sie die palette Nummer ändern oder die Palette mit dem Namen scale_fill_brewer(palette="GnBu") aufrufen. Suchen Sie die Palettennamen auf der Color Brewer-Webseite.

foo <- read.table(header=TRUE, 
       text="species density day percent 
        1 species1 high 1 0.40 
        2 species1  low 1 0.20 
        3 species1 medium 1 0.40 
        4 species2 high 1 0.35 
        5 species2  low 1 0.10 
        6 species2 medium 1 0.55 
        7 species3 high 1 0.35 
        8 species3  low 1 0.20 
        9 species3 medium 1 0.45 
        10 species4 high 1 0.30 
        11 species4  low 1 0.20 
        12 species4 medium 1 0.50 
        13 species1 high 100 0.50 
        14 species1  low 100 0.40 
        15 species1 medium 100 0.10 
        16 species2 high 100 0.40 
        17 species2  low 100 0.05 
        18 species2 medium 100 0.55 
        19 species3 high 100 0.65 
        20 species3  low 100 0.05 
        21 species3 medium 100 0.30 
        22 species4 high 100 0.40 
        23 species4  low 100 0.20 
        24 species4 medium 100 0.40") 

foo$density <- factor(foo$density, levels=c("low", "medium", "high")) 
foo$day <- factor(paste("Day", foo$day, sep="_")) 

library(ggplot2) 

d2 <- ggplot(foo, aes(x=day, y=percent, fill=density)) + 
     theme_bw() + 
     geom_bar(width=0.95, stat="identity") + 
     scale_fill_brewer(type="seq", palette=15) + 
     xlab("Species") + 
     opts(axis.text.x=theme_text(size=6)) + 
     facet_grid(. ~ species) 

ggsave("barplot_1.png", d2, width=6, height=4) 

enter image description here

Ein Problem, das ich nicht gelöst haben, ist, dass das Niveau der density in der richtigen Reihenfolge stapeln nicht (für mich oder in @ Antwort MYaseen208 ist). Das Stapeln ist im ursprünglichen Beitrag korrekt. Weiß jemand, was das Problem ist?

+0

gute Vorschläge. Ich hatte gehofft, die Namen der Spezies auch unten auf der Grafik zu haben (zwischen "Tag" und dem X-Achsen-Label). Ich möchte, dass "Tag" eine einzige x-Achse teilt und es keine Linien gibt, die jede Spezies abgrenzen (so scheint es ein einzelner Graph zu sein). Ich werde Color Brewer und andere raffinierte Tricks für das Endprodukt verwenden, aber aus Gründen der Einfachheit habe ich diese Details weggelassen. Was das Stapelproblem angeht - nicht sicher, was es sein könnte, aber wenn Sie die Daten als .csv speichern und so importieren, wird es korrekt gestapelt. –

+0

Ich bin froh, dass ich helfen kann (ein bisschen, hoffe ich.) Ich bin mir nicht sicher, was es für "Tag" bedeuten würde, eine einzige x-Achse zu teilen. Für das Platzieren von Artenlabels entlang der X-Achse - es kann am sinnvollsten sein, eine PDF-Version in Adobe Illustrator (oder Inkscape) zu bringen, um die Anpassung abzuschließen. (Ich bin mir sicher, dass es Hacks gibt, mit ggplot2 oder Grid-Code zu tun, was Sie wollen, aber es gibt einen Punkt, an dem die Erträge zurückgehen). – bdemarest