plagueheart
plagueheart

Reputation: 239

ggplot2 & facet_wrap - eliminate vertical distance between facets

I'm working with some data that I want to display as a nxn grid of plots. Edit: To be more clear, there's 21 categories in my data. I want to facet by category, and have those 21 plots in a 5 x 5 square grid (where the orphan is by itself on the fifth row). Thus facet_wrap instead of facet_grid.

I've got the following code written up for doing it (using the good old iris data set for my reproducible example):

library(ggplot2)
library(grid)

cust_theme <- theme_bw() + theme(legend.position="none", 
              axis.title = element_blank(), axis.ticks = element_blank(), 
              axis.text = element_blank(), strip.text = element_blank(), 
              strip.background = element_blank(), panel.margin = unit(0, "lines"), 
              panel.border = element_rect(size = 0.25, color = "black"), 
              panel.grid = element_blank())

iris.plot <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
             geom_point() + cust_theme + facet_wrap( ~ Species, ncol = 2) + 
             labs(title = "Irises by species")

This gives me ALMOST what I want, but not quite:

Plot of iris data set per above code.

I've still got a tiny strip of space between the top row of plots and the bottom row. I'd like to get rid of that entirely, but panel.margin is obviously not doing it. Is there a way to do this?

Upvotes: 6

Views: 12319

Answers (3)

TheSciGuy
TheSciGuy

Reputation: 1196

This might be a little late, but panel.marginis now deprecated. Inside theme use panel.spacing. To eliminate the spacing between the facets then load the grid package and use panel.spacing = unit(0, "lines")

Upvotes: 10

hrbrmstr
hrbrmstr

Reputation: 78792

You can also edit the grobs directly:

library(ggplot2)
library(grid)

g <-  ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
  geom_point() +
  facet_wrap( ~ Species, ncol = 2) +
  labs(title = "Irises by species") +
  theme_bw() +
  theme(panel.margin = unit(0, "lines")) +
  theme(plot.margin = unit(c(0,0,0,0), "lines")) +
  theme(strip.background = element_blank()) +
  theme(plot.background = element_blank()) +
  theme(strip.text = element_blank()) +
  theme(axis.ticks.margin = unit(0, "lines"))

g <- ggplotGrob(p)

g$heights[[7]] = unit(0, "lines")

grid.newpage()
grid.draw(g)

enter image description here

Upvotes: 5

cr1msonB1ade
cr1msonB1ade

Reputation: 1716

Change the panel.margin argument to panel.margin = unit(c(-0.5,0-0.5,0), "lines"). For some reason the top and bottom margins need to be negative to line up perfectly. Here is the result:

enter image description here

Upvotes: 9

Related Questions