4

I built a function for quickly plotting a table with a lot of help from this answer from @baptiste.

plotTable<-function(data, title=NULL, footnote=NULL, fontsize=9, plotIt=TRUE, show.rownames=TRUE){
  # Generic method to plot tabular data

  # Built the base table with/without row names
  if(show.rownames){
    table <- tableGrob(data, theme=ttheme_default(
      core=list(fg_params=list(fontsize=fontsize)),
      colhead=list(fg_params=list(fontsize=fontsize)),
      rowhead=list(fg_params=list(fontsize=fontsize))))
  } else{
    table <- tableGrob(data, theme=ttheme_default(
      core=list(fg_params=list(fontsize=fontsize)),
      colhead=list(fg_params=list(fontsize=fontsize)),
      rowhead=list(fg_params=list(fontsize=fontsize))), rows=NULL)
  }

  # Set the padding
  padding <- unit(0.5,"line")

  # Add the title if it's not NULL
  if(!is.null(title)){
    title.grob <- textGrob(title, gp=gpar(fontsize=fontsize+3))
    table <- gtable_add_rows(table, heights = grobHeight(title.grob) + padding, pos = 0)
    table <- gtable_add_grob(table, list(title.grob), t=1, l=1, r=ncol(table))
  }

  # Add the footnote if it's not NULL
  if(!is.null(footnote)){
    footnote.grob <- textGrob(footnote, x=0, hjust=0, gp=gpar(fontsize=fontsize, fontface="italic"))
    table <- gtable_add_rows(table, heights = grobHeight(footnote.grob)+ padding)
    table <- gtable_add_grob(table, list(footnote.grob), t=nrow(table), l=1, r=ncol(table))
  }

  # Either plot it or return the grob
  if(plotIt) grid.arrange(table) else return(table)
}

But sometimes my title is longer than the actual table and it's getting cut off.

libs <- c("data.table", "grid", "gridExtra", "gtable")
lapply(libs, library, character.only = TRUE)

mytable <- data.table(x=c(1,2,3), y=c(3,2,1))
plotTable(mytable, title="Hello World")

the table

How do I fix this?

Community
  • 1
  • 1
Ben
  • 20,038
  • 30
  • 112
  • 189
  • Two possibilities, (i) try to reduce the font size in `title.grob <- textGrob(title, gp=gpar(fontsize=fontsize+3))`, (ii) enter a new line after `Hello`. – Stereo Sep 01 '15 at 03:53

2 Answers2

7

You can set the table widths manually, but you'll need to decide which column(s) should be expanded and by how much. I guess a reasonable way to redistribute the widths is to add the same margin to each column, so that the total space gained accounts for the extra room needed for the title.

enter image description here

library(gridExtra)
d <- head(iris[,1:2])
table <- tableGrob(d, rows=NULL)

library(grid)
library(gtable)

title <- textGrob("my long title goes here",gp=gpar(fontsize=30))
padding <- unit(1,"line")
table <- gtable_add_rows(table, 
                         heights = grobHeight(title) + padding,
                         pos = 0)
table <- gtable_add_grob(table, title,
                         t=1, l=1, 
                         r=ncol(table))

# check whether the table width is smaller than the title width
missed <- convertWidth(sum(table$widths), "in", valueOnly = TRUE) -
  convertWidth(grobWidth(title), "in", valueOnly = TRUE)

if(missed < 0 ) # need to do something about it
  table$widths <- table$widths + unit(abs(missed)/ncol(table), "in")

grid.newpage()
grid.draw(table)
baptiste
  • 75,767
  • 19
  • 198
  • 294
4

another option, if you don't want the cells to be resized, is to turn clipping off,

table$layout$clip <- "off"

enter image description here

baptiste
  • 75,767
  • 19
  • 198
  • 294