I was so happy to find the greater part of a solution to my question in the post, "Force X axis text on for all facets of a facet_grid plot".
I'd like to create a graph to look somewhat like the OP Drew Steen's, except I have more than two rows of facets, and I'd like to make the x-axes labels different for each row.
I made a super-hacky solution out of @baptiste's awesome answer (mostly because I am unfamiliar with the gtable package), and I'd like to know:
- If there is a more elegant solution than the mess I wrote below
- How to insert labels for the "Premium" (middle) row.
Here is the code I adapted from @Drew Steen and @baptiste,
library(ggplot2)
diamondSub <-subset(diamonds, (cut=="Ideal" | cut=="Premium" | cut == "Very Good") & (color=="E" | color=="I"))
p<- ggplot(diamondSub, aes(x=carat, y=price)) +
geom_blank()+
geom_point() +
scale_x_discrete(breaks=c(1, 2, 3, 4), labels=c("a", "b", "c", "d")) +
facet_grid(cut~color, scales="free_x")
p
p2<- ggplot(diamondSub, aes(x=carat, y=price)) +
geom_blank()+
geom_point() +
scale_x_discrete(breaks=c(1, 2, 3, 4), labels=c("f", "g", "h", "i")) +
facet_grid(cut~color, scales="free_x")
p2
library(gtable)
g <- ggplotGrob(p)
g2 <- ggplotGrob(p2)
# locate the panels
panels <- grep("panel", g$layout$name)
panels2 <- grep("panel", g2$layout$name)
top <- unique(g$layout$t[panels])
top2 <- unique(g2$layout$t[panels2])
# intersperse a copy of the bottom axes
all <- gtable:::rbind_gtable(gtable:::rbind_gtable(g[seq.int(min(top)), ],
g[max(top)+1,], "first"),
g2[seq(min(top2)+1, nrow(g2)),], "first")
grid.newpage()
grid.draw(all)
Alternative Version (added 24 April 2015) showing manual construction of the elements and containing more commenting.
But you don't even need to do the binding of the panel to the axis; just select the appropriate rows from the layout:
then bind these three new rows.
Original Version
It is only in the binding of the rows that you have made a mistake. You have bound an axis to the top "Very Good" row. The bottom "Ideal" row already has an axis, so no binding is required. To Fix: The middle "Premium" row needs an axis.
I have constructed each row separately, binding an axis to the top and middle rows, then binding the three rows.
I've added another step to add a little more space between the rows.