Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

show ggplot2 title without reserving space for it

Tags:

r

ggplot2

I am trying to set titles to some ggplot2 charts, while leaving some without titles. Unfortunately, when title is set, the y axis and the plot shrink (see the plot on the right). I need to plot the title without changing the Y axis size, so that titled charts are on the same scale with the others (as in the middle plot).

grid.arrange(
  (ggplot(mtcars, aes(mpg, hp)) + geom_point()),
  (ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    geom_text(aes(22.5, 340, label="fake title",  vjust = 1, hjust = .5, show_guide = FALSE))),
  (ggplot(mtcars, aes(mpg, hp)) + geom_point() +
    labs(title="real title")),
  ncol=3)

plot sample

I cannot use fake empty-string titles on the other plots, because I am short on space. I could use the geom_text() method, if anyone can tell me how to make it look less garbled. So, how do I removing any reserved space for the title above the plot, while still showing the plot title on and at the top of the plot area? The latter is done with theme(plot.title = element_text(vjust=-1)).)

like image 528
nvja Avatar asked May 27 '15 20:05

nvja


1 Answers

Edit Thanks to @baptiste for pointing out a more concise way to accomplish this. Given p1, p2, and p3 from below:

pl = lapply(list(p1,p2,p3), ggplotGrob)
grid.newpage()
grid.draw(do.call(cbind, c(pl, size="first")))

Original answer

You can build the ggplot grobs and standardize the heights parameter across plots:

p1 <- ggplot(mtcars, aes(mpg, hp)) + geom_point()
p2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() + labs(title="real title")
p3 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    geom_text(aes(22.5, 340, label="fake title",  vjust = 1, hjust = .5, show_guide = FALSE))

p1 <- ggplot_gtable(ggplot_build(p1))
p2 <- ggplot_gtable(ggplot_build(p2))
p3 <- ggplot_gtable(ggplot_build(p3))

p2$heights <- p1$heights
p3$heights <- p1$heights

grid.arrange(p1, p2, p3, ncol=3)

enter image description here

You can then use the title's vjust setting to move it off of the plot or further onto the plot, if you want:

p2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    labs(title="real title") + 
    theme(plot.title=element_text(vjust=-.3))

enter image description here

like image 115
Matthew Plourde Avatar answered Sep 30 '22 05:09

Matthew Plourde