ggplot2 – gráfico de barras com stack e dodge

Eu estou tentando criar um barplot usando ggplot2 onde eu estou empilhando por uma variável e esquivando por outro.

Aqui está um exemplo de dataset:

 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)) 

Eu gostaria de criar um gráfico de barras onde x=treatment , y=total , a variável empilhada é type e a variável dodged é year . Claro que posso fazer um ou outro:

 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") 

Mas não os dois! Obrigado a qualquer um que possa dar conselhos.

Aqui está uma alternativa para usar o faceting em vez de evitar:

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

insira a descrição da imagem aqui

Com a mudança sugerida por Tyler:

insira a descrição da imagem aqui

O mais próximo que você pode conseguir é desenhar uma borda ao redor das barras dodged para destacar os valores de type empilhados.

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

insira a descrição da imagem aqui

Você pode usar a interaction(year, treatment) como a variável do eixo x como uma alternativa para se dodge .

 library(tidyverse) 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)) %>% mutate(x_label = factor(str_replace(interaction(year, treatment), '\\.', ' / '), ordered=TRUE)) ggplot(df, aes(x=x_label, y=total, fill=type)) + geom_bar(stat='identity') + labs(x='Year / Treatment') 

Criado em 2018-04-26 pelo pacote reprex (v0.2.0).