2012-10-03 31 views
18

Estoy tratando de crear un diagrama de barras usando ggplot2 donde estoy apilando por una variable y esquivando por otra.ggplot2 - gráfico de barras con stack y dodge

Aquí es un conjunto de datos de ejemplo:

df=data.frame(
    year=rep(c("2010","2011"),each=4), 
    treatment=rep(c("Impact","Control")), 
    type=rep(c("Phylum1","Phylum2"),each=2), 
    total=sample(1:100,8)) 

me gustaría crear un barplot donde x=treatment, y=total, la variable apilada es type y la variable esquivado es year. Por supuesto que puedo hacer uno u otro:

ggplot(df,aes(y=total,x=treatment,fill=type))+geom_bar(position="dodge",stat="identity") 

ggplot(df,aes(y=total,x=treatment,fill=year))+geom_bar(position="dodge",stat="identity") 

¡Pero no ambos! Gracias a cualquiera que pueda dar consejos.

+3

Solo puede hacer una o la otra, no ambas. Vea mi respuesta relacionada aquí: http://stackoverflow.com/questions/12592041/plotting-a-stacked-bar-plot/12592235#12592235 – Maiasaura

Respuesta

15

Aquí está una alternativa toma utilizando tallar en lugar de esquivar:

ggplot(df, aes(x = year, y = total, fill = type)) + 
    geom_bar(position = "stack", stat = "identity") + 
    facet_wrap(~ treatment) 

enter image description here

Con el cambio sugerido de Tyler:

enter image description here

+1

Buena alternativa al deseo de ambos. +1 – Maiasaura

+0

Hmm, idea interesante. ¡Supongo que tendrá que hacer! Gracias a @Maiasaura y Matt Parker – jslefche

+7

agregando '+ theme (panel.margin = unit (-1.25," lines "))' puede hacer que se vean más como si estuvieran en el mismo campo visual pero aún no es exactamente lo que el OP fue después. Buena mejor alternativa. +1 –

6

Lo más cercano que puede obtener es dibujando un borde alrededor de las barras dodged para resaltar los valores apilados type.

ggplot(df, aes(treatment, total, fill = year)) + 
geom_bar(stat="identity", position="dodge", color="black") 

enter image description here

+1

Hmm, los bordes no parecen alinearse con los datos. Por ejemplo, 'set.seed (8)' antes de ejecutar el código y observar los valores. – jslefche

+1

Si realmente quieres ser elegante, apuesto a que puedes usar 'geom_rect' para completar algunas partes pero luego estás usando ggplot para dibujar en lugar de trazar. –

Cuestiones relacionadas