I am trying to create a barplot using ggplot2
where I am stacking by one variable and dodging by another.
Here is an example data set:
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))
I would like to create a barplot where x=treatment
, y=total
, the stacked variable is type
and the dodged variable is year
. Of course I can do one or the other:
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")
But not both! Thanks to anyone who can provide advice.
Here's an alternative take using faceting instead of dodging:
ggplot(df, aes(x = year, y = total, fill = type)) + geom_bar(position = "stack", stat = "identity") + facet_wrap( ~ treatment)
With Tyler's suggested change: + theme(panel.margin = grid::unit(-1.25, "lines"))
You can use interaction(year, treatment)
as the x-axis variable as an alternative to dodge
.
library(dplyr) library(ggplot2) 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')
Created on 2018-04-26 by the reprex package (v0.2.0).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With