Using facet_grid()
, how can I place the group names, i.e. the grey strips, on the top of the plots when graphing the plots stacked vertically in a single column?
From what I have tried, when stacking the plots vertically, using facet_grid()
, you cannot place the strip on the top or bottom of the graph; you can only place the strip on the right hand side or the left hand side of the plots using the switch = c("y", "x", "both")
argument.
I am aware that facet_wrap()
(and facet_col()
from ggforce) can place the strip anywhere using the strip.position = c("top", "bottom", "left", "right")
argument, irrespective of how the graphs are being plotted: vertically or horizontally. I used facet_wrap()
to produce Fig.1 below (code is in the Reproducible Code section).
However, I would like to be able to produce the plot below (with the strip on "top") using facet_grid()
not facet_wrap.
Fig.1: I want to be able to plot this using facet_grid()
Ideally, it would be great if the switch argument could be extended or the strip.position
argument could be added to facet_grid()
, to be able to place the strip on top. I tried to do it myself by trying to change the source code from facet_grid()
and facet_wrap()
functions, but could not figure it out.
The reason I am not simply using facet_wrap()
function is because it unfortunately does not have the space="free"
argument which is available in facet_grid()
and is essential in my application.
Below is a reproducible example taken from, with slight modifications, the code of Brandon Bertelsen answer's here:
Reproducible Code:
The Data:
dat <- data.frame(value=runif(30)*10,
grouping=c(rep("Group 1",10),
rep("Group 2",10),
rep("Group 3",10)),
letters=rep(LETTERS[1:10], 3)
Using facet_wrap
to get strip on top when plotting graphs vertically:
ggplot(dat, aes(letters,value, label = letters)) +
geom_bar(stat="identity") +
facet_wrap(grouping~., dir = "v")
Produces Fig.1:
Using facet_grid
with the switch = "y"
places the strip to the left hand side:
ggplot(dat, aes(letters,value, label = letters)) +
geom_bar(stat="identity") +
facet_grid(grouping~., switch = "y")
Produces Fig.2:
Using facet_grid
with the switch = "x"
places the strip to the right hand side:
ggplot(dat, aes(letters,value, label = letters)) +
geom_bar(stat="identity") +
facet_grid(grouping~., switch = "x")
Produces Fig.3:
With no other options remaining I turn here for help.
scales = 'free'
out and just dofacet_wrap(grouping~., dir = "v")
you should get what you want. – Deanadeandafacet_grid
? For example,facet_col
from theggforce
package may serve your needs. See discussion here. – Fogarty