16

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.

zx8754
  • 52,746
  • 12
  • 114
  • 209
ch-pub
  • 1,664
  • 6
  • 29
  • 52

1 Answers1

22

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

zx8754
  • 52,746
  • 12
  • 114
  • 209
user20650
  • 24,654
  • 5
  • 56
  • 91
  • I would like to do the same, but with 1 plot and one table. but i get an error when i run `layout(matrix(c(1,3), nrow = 1, ncol = 2, byrow = TRUE))`. `Error in layout(matrix(c(1, 3), nrow = 1, ncol = 2, byrow = TRUE)) : layout matrix must contain at least one reference to each of the values {1 ... 3}` – quant Mar 30 '17 at 10:54
  • @Quant, You have to say the positions of each the plots that you reference with the numbers in layout, from min to max. You only have 1 and 3 but no 2 ( as the error says; but not too clearly. So use c(1,2). – user20650 Mar 30 '17 at 12:42