2012-08-02 16 views
7

Lavorando dal seguente dataframe:a due fattori grafico a barre

> 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 

ho creato il seguente sfaccettato grafico a barre:

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

Tuttavia, vorrei unire questi grafici per creare un grafico a barre a due fattori. Sull'asse x, ogni giorno - 1 e 100 - sarebbero raggruppati per specie. Qualche suggerimento su come creare questo?

Grazie mille!

risposta

4

provare questo

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 È possibile riorganizzare i livelli se si vuole.

+0

Oppure è possibile convertire 'day' in un fattore e sfaccettatura su' species' ... – joran

+1

@joran Mi piace l'idea di sfaccettatura per specie, ma l'etichettatura dell'asse x diventa un problema. Vorrei che le "specie" fossero l'etichetta dell'asse x focale (nella parte inferiore del grafico) e il "giorno" da impostare in ciascuna "specie" (anche in basso). –

+0

@ MYaseen208 Grazie per questo suggerimento, mi piace come è tutto su un singolo grafico. Esiste comunque la possibilità di creare sempre più spazio tra le barre per "raggruppare" per specie? –

1

Ecco un altro approccio che incorpora il suggerimento di @ Joran insieme alle vostre esigenze.

Ho modificato day in un fattore, ma ho anche cambiato l'etichetta dell'asse x predefinita in "Specie". Inoltre, poiché density è chiaramente un fattore sequenziale, ho utilizzato una scala di colori sequenziale da Color Brewer (http://colorbrewer2.org/). È possibile sperimentare con le scale di colori modificando il numero palette o la tavolozza chiamata per nome scale_fill_brewer(palette="GnBu"). Trova i nomi delle palette sulla pagina Web di Color Brewer.

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

Un problema che non ho risolto è che i livelli di density non si sommano nel giusto ordine (per me o @ di MYaseen208 risposta). L'impilamento è corretto nel post originale. Qualcuno sa qual è il problema?

+0

buoni suggerimenti. Speravo di avere i nomi 'specie' nella parte inferiore del grafico (tra' day' e l'etichetta dell'asse x). Vorrei che 'day' condividesse un singolo asse x e non ci fossero linee che demarcassero ciascuna specie (quindi sembra essere un singolo grafico). Userò Color Brewer e altri trucchi fantasiosi per il prodotto finale, ma per amor di semplicità ho omesso quei dettagli. Per quanto riguarda il problema di stacking, non sono sicuro di cosa potrebbe essere, ma se si salvano i dati come un .csv e lo si importa in questo modo si impila correttamente. –

+0

Sono felice di essere in grado di aiutare (un po ', spero.) Non sono sicuro di cosa significherebbe per "day' condividere un singolo asse x". Per quanto riguarda il posizionamento delle etichette delle specie lungo l'asse x, potrebbe essere più opportuno portare una versione pdf in Adobe Illustrator (o Inkscape) per completare la personalizzazione. (Sono sicuro che ci sono hack per fare quello che vuoi con ggplot2 o il codice della griglia, ma c'è un punto di rendimenti decrescenti). – bdemarest

Problemi correlati