Arrange base plots and grid.tables on the same page

ch-pub picture ch-pub · Aug 7, 2014 · Viewed 9.7k times · Source

I have 2 plots (created using Base graphics) and 2 data frames that I would like to combine onto one sheet in a PDF. I'm using grid.table to create a tableGrobs from my data frames. I'm having a lot of difficulty formatting the PDF output. In particular, I've been unsuccessful keeping all the objects on the same page. I want the right pannel to contain one graph, and the left panel to contain the other graph, and 2 tables below (landscape format).

Currently my code is something like the following:

library('gridExtra')

pdf("Rplots.pdf", paper = "USr", height = 8.5, width = 11)

layout(matrix(c(1,3, 2,3, 4,3), nrow = 3, ncol = 2, byrow = TRUE))

plot(myPlot1)    
grid.table(df1)    
plot(myPlot2)
grid.table(df2)

dev.off()

I do not want to use ggplot2.

Answer

user20650 picture user20650 · Aug 8, 2014

To combine base plots and grid objects the package gridBase is useful.

A rough worked example base on your layout above

library(grid)
library(gridBase)
library(gridExtra)


layout(matrix(c(1,3, 2,3, 4,3), nrow = 3, ncol = 2, byrow = TRUE))

# First base plot
plot(1:10)

# second base plot 
frame()
# Grid regions of current base plot (ie from frame)
vps <- baseViewports()
pushViewport(vps$inner, vps$figure, vps$plot)
# Table grob
grob <-  tableGrob(iris[1:2,1:2])  
grid.draw(grob)

popViewport(3)

# third base plot
plot(1:10)

# fourth
frame()
vps <- baseViewports()
pushViewport(vps$inner, vps$figure, vps$plot)  
grid.draw(grob)
popViewport(3)

Which gives

enter image description here