Use fields
From about ggplot2 ver 2.1.0: In theme specify the fields in the strip_text element (see here ).
library(ggplot2) library(gcookbook) # For the data set p = ggplot(cabbage_exp, aes(x=Cultivar, y=Weight)) + geom_bar(stat="identity") + facet_grid(. ~ Date) + theme(strip.text = element_text(face="bold", size=9), strip.background = element_rect(fill="lightblue", colour="black",size=1)) p + theme(strip.text.x = element_text(margin = margin(.1, 0, .1, 0, "cm")))
Original answer updated to ggplot2 v2.2.0
Your facet_grid chart
This will reduce the height of the strip (if you want) to zero height. The height should be set for one strip and three gnomes. This will work with your specific facet_grid example.
library(ggplot2) library(grid) library(gtable) library(gcookbook) # For the data set p = ggplot(cabbage_exp, aes(x=Cultivar, y=Weight)) + geom_bar(stat="identity") + facet_grid(. ~ Date) + theme(strip.text = element_text(face="bold", size=9), strip.background = element_rect(fill="lightblue", colour="black",size=1)) g = ggplotGrob(p) g$heights[6] = unit(0.4, "cm") # Set the height for(i in 13:15) g$grobs[[i]]$heights = unit(1, "npc") # Set height of grobs grid.newpage() grid.draw(g)
Your Facet_wrap Chart
There are three stripes on the page. Therefore, you must change the three heights of the strip and change the three heights of the block.
The following will work with your specific facet_wrap example.
p = ggplot(cabbage_exp, aes(x=Cultivar, y=Weight)) + geom_bar(stat="identity") + facet_wrap(~ Date,ncol = 1) + theme(strip.text = element_text(face="bold", size=9), strip.background = element_rect(fill="lightblue", colour="black",size=1)) g = ggplotGrob(p) for(i in c(6,11,16)) g$heights[[i]] = unit(0.4,"cm")
How to find appropriate heights and rodents?
g$heights returns the height vector. 1st height are story panels. The height of the strip is one earlier - it is 6, 11, 16.
g$layout returns a data frame with the names of the gnomes in the last column. Rodents that need their heights change with names starting with a โstripeโ. They are in lines 17, 18, 19.
To generalize a little
p = ggplot(cabbage_exp, aes(x=Cultivar, y=Weight)) + geom_bar(stat="identity") + facet_wrap(~ Date,ncol = 1) + theme(strip.text = element_text(face="bold", size=9), strip.background = element_rect(fill="lightblue", colour="black",size=1)) g = ggplotGrob(p) # The heights that need changing are in positions one less than the plot panels pos = c(subset(g$layout, grepl("panel", g$layout$name), select = t)) for(i in pos) g$heights[i-1] = unit(0.4,"cm") # The grobs that need their heights changed: grobs = which(grepl("strip", g$layout$name)) for(i in grobs) g$grobs[[i]]$heights <- unit(1, "npc") grid.newpage() grid.draw(g)
Multiple Panels Per Row
Almost the same code can be used, even with a title and legend located on top. There is a change in the calculation of pos , but even without this change, the code is executed.
library(ggplot2) library(grid) # Some data df = data.frame(x= rnorm(100), y = rnorm(100), z = sample(1:12, 100, T), col = sample(c("a","b"), 100, T)) # The plot p = ggplot(df, aes(x = x, y = y, colour = col)) + geom_point() + labs(title = "Made-up data") + facet_wrap(~ z, nrow = 4) + theme(legend.position = "top") g = ggplotGrob(p) # The heights that need changing are in positions one less than the plot panels pos = c(unique(subset(g$layout, grepl("panel", g$layout$name), select = t))) for(i in pos) g$heights[i-1] = unit(0.2, "cm") # The grobs that need their heights changed: grobs = which(grepl("strip", g$layout$name)) for(i in grobs) g$grobs[[i]]$heights <- unit(1, "npc") grid.newpage() grid.draw(g)