How do I fit a very wide grid.table or tableGrob to fit on a pdf page?

11,841

Solution 1

I got this done using font sizes. Not the best solution (requires manual intervention) but maybe someone can contribute something more elegant.

termTable = tableGrob(terms, h.even.alpha=1, h.odd.alpha=1,  v.even.alpha=0.5, v.odd.alpha=1, core.just='left', rows=c(),
gpar.coretext =gpar(fontsize=8),
gpar.coltext=gpar(fontsize=10, fontface='bold'),
gpar.rowtext=gpar(fontsize=10, fontface='bold')
)

Solution 2

There is a way, but it's unclear what should happen when the text is too wide to fit in some cells.

One option is to set the widths manually,

library(grid)
library(gridExtra)
g1 <- g2 <- tableGrob(head(iris, 10), rows=NULL)
g2$widths <- unit(rep(1/ncol(g2), ncol(g2)), "npc")
grid.newpage()
gt = arrangeGrob(textGrob("page 1"), textGrob("page 2"), 
                 rectGrob(gp=gpar(fill="grey98")), 
                 rectGrob(gp=gpar(fill="grey98")), 
                 nullGrob(),  
                 layout_matrix=rbind(c(1,5,2), c(3,5,4)),
                 widths = unit(c(1,5,1),c("null", "cm", "null")), 
                 heights = unit(c(1, 1),c("line", "null")),
                 vp = viewport(width=0.9, height=0.9))
tc = list(g1, g2)
gt <- gtable::gtable_add_grob(gt, tc, l=c(1,3), t=2, 
                               name="newgrobs")

grid.draw(gt)

but of course with a fixed font size it means that some text might be cut.

enter image description here

Probably a better option is to introduce line breaks, and/or (slightly) reduce the font size.

g3 <- tableGrob(head(iris, 10), theme = ttheme_default(7),
                rows=NULL, cols=gsub("\\.", "\\\n",names(iris)))
g3$widths <- unit(rep(1/ncol(g2), ncol(g2)), "npc")

grid.newpage()

gt = arrangeGrob(textGrob("page 1"), textGrob("page 2"), 
                 rectGrob(gp=gpar(fill="grey98")), 
                 rectGrob(gp=gpar(fill="grey98")), 
                 nullGrob(),  
                 layout_matrix=rbind(c(1,5,2), c(3,5,4)),
                 widths = unit(c(1,1,1),c("null", "line", "null")), 
                 heights = unit(c(1, 1),c("line", "null")),
                 vp = viewport(width=0.9, height=0.9))
tc = list(g2, g3)
gt <- gtable::gtable_add_grob(gt, tc, l=c(1,3), t=2, 
                              name="newgrobs")

grid.draw(gt)

enter image description here

Share:
11,841
rimorob
Author by

rimorob

Updated on June 28, 2022

Comments

  • rimorob
    rimorob almost 2 years

    I have a fairly wide table (4/3 of page width) that I'm trying to print using grid.table or grid.arrange (via tableGrob) into a pdf file. The table goes beyond page boundaries and gets clipped. Is there a way to force grid.table/grid.arrange to scale the table to the print area?

    • baptiste
      baptiste about 10 years
      nope, by design. If the table was scaled to the page, then the text would have to be scaled to fit in the cells rather than being at a fixed font size, and I chose not to do that.
    • rimorob
      rimorob about 10 years
      That's an explanation but not a reason. Why did you choose not to implement that? Great tool, by the way!