That's nice. Thank you @andresrcs!
Can we take it a step further for cases having more than one row of facets? Ideally, I would love to get all facets of equal size. If facets only have 1 or 2 bars, insert blank (Value = 0) bars to keep their size the same. I know it may be too much to ask for 
library(dplyr)
library(ggplot2)
dat <- read.table(
text = "Exp ID Value Day Order
Ex1 AA 0.443 Day1 1
Ex1 BB 0.110 Day1 2
Ex1 DD 0.129 Day2 3
Ex1 BB 0.076 Day2 4
Ex1 DD 0.500 Day3 5
Ex1 CC 0.143 Day3 6
Ex1 AA 0.034 Day3 7
Ex2 BB 0.543 Day1 8
Ex2 AA 0.310 Day1 9
Ex2 CC 0.150 Day1 10
Ex2 DD 0.329 Day2 11
Ex2 BB 0.196 Day2 12
Ex2 AA 0.056 Day2 13
Ex2 BB 0.300 Day3 14
Ex2 CC 0.243 Day3 15
Ex2 DD 0.134 Day3 16",
header = TRUE)
## Try facet for 2 variables
ggplot(dat,
aes(Order, Value)) +
geom_col(aes(fill = ID),
width = 0.8,
position = position_dodge2(width = 0.8, preserve = "single")) +
facet_grid(Exp ~ Day,
scales= "free",
space = "free") +
scale_x_continuous(
breaks = dat$Order,
labels = dat$ID)

## Try cowplot
gg1 <- ggplot(dat %>% filter(Exp == "Ex1"),
aes(Order, Value)) +
geom_col(aes(fill = ID),
width = 0.8,
position = position_dodge2(width = 0.8, preserve = "single")) +
facet_grid(. ~ Day,
scales= "free",
space = "free") +
scale_x_continuous(
breaks = dat$Order,
labels = dat$ID)
gg2 <- ggplot(dat %>% filter(Exp == "Ex2"),
aes(Order, Value)) +
geom_col(aes(fill = ID),
width = 0.8,
position = position_dodge2(width = 0.8, preserve = "single")) +
facet_grid(. ~ Day,
scales= "free",
space = "free") +
scale_x_continuous(
breaks = dat$Order,
labels = dat$ID)
library(cowplot)
plot_grid(gg1, gg2,
nrow = 2)
