2012-08-02 18 views
7

Trabajando a partir de la siguiente trama de datos:de dos factores diagrama de barras

> 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 

He creado el siguiente gráfico de barras facetas:

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

Sin embargo, me gustaría fusionar estos gráficos para crear un solo gráfico de barras de dos factores. En el eje x, cada día-1 y 100-se agruparía por especie. ¿Alguna sugerencia sobre cómo crear esto?

¡Muchas gracias!

Respuesta

4

prueba este

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 Puede reorganizar los niveles si lo desea.

+0

O podría convertir 'día' en un factor y una faceta en' especies' ... – joran

+1

@joran Me gusta la idea de facetar por especie, pero luego el etiquetado del eje x se convierte en un problema. Me gustaría que 'especies' sea la etiqueta focal del eje x (en la parte inferior del gráfico) y 'día' que se establecerá con cada 'especie' (también en la parte inferior). –

+0

@ MYaseen208 Gracias por esta sugerencia. Me gusta cómo está todo en un solo gráfico. ¿Hay alguna forma de crear más y menos espacio entre barras para 'agrupar' por especie? –

1

Aquí hay otro enfoque que incorpora la sugerencia de @ Joran junto con sus requisitos.

He cambiado day a un factor, pero también cambié la etiqueta predeterminada del eje x a "Especie". Además, debido a que density es claramente un factor secuencial, he usado una escala de color secuencial de Color Brewer (http://colorbrewer2.org/). Puede experimentar con escalas de color cambiando el número palette o llamando a la paleta por el nombre scale_fill_brewer(palette="GnBu"). Encuentre los nombres de la paleta en la página web de 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 que no he resuelto es que los niveles de density no se apilan en el orden correcto (para mí o en respuesta de @ MYaseen208). El apilamiento es correcto en la publicación original. Alguien sabe cual es el problema?

+0

buenas sugerencias. Esperaba tener los nombres de 'especie' en la parte inferior del gráfico también (entre 'día' y la etiqueta del eje x). Me gustaría que 'day' comparta un solo eje x y que no haya líneas que demarquen cada especie (por lo que parece ser un solo gráfico). Usaré Color Brewer y otros trucos de fantasía para el producto final, pero por simplicidades omití esos detalles. En cuanto al problema de apilamiento, no estoy seguro de qué podría ser, pero si guarda los datos como .csv e lo importa de esa manera, se acumula correctamente. –

+0

Me alegra poder ayudar (un poco, espero). No estoy seguro de lo que significaría para "el día" compartir un solo eje x ". En cuanto a colocar etiquetas de especies a lo largo del eje x, puede ser más conveniente llevar una versión en PDF a Adobe Illustrator (o Inkscape) para completar la personalización. (Estoy seguro de que hay hacks para hacer lo que quieras con ggplot2 o código de cuadrícula, pero hay un punto de rendimientos decrecientes). – bdemarest

Cuestiones relacionadas