rgridextragrob

Adding a subtitle text to a grid.table plot


I have a question very similar to what discussed here: Adding text to a grid.table plot my ultimate goal however is to have a title 60mm from the top of the table, and a subtitle 2mm below the title. I came up with this code that is almost there but not there, meaning, the subtitle is 2mm from the top of the table, and 2mm below the title, as expected.

library(gridExtra)
  library(grid)
  library(gtable)
  d <- head(iris)
  table <- tableGrob(d)
  
  title <- textGrob("Title",gp=gpar(fontsize=50))
  subtitle <- textGrob("subtitle", x=0, hjust=0,
                       gp=gpar( fontface="italic"))
  
  padding <- unit(2,"mm")
  
  table <- gtable_add_rows(table, 
                           heights = grobHeight(subtitle)+ padding,
                           pos = 0)
  
  padding <- unit(60,"mm")
  table <- gtable_add_rows(table, 
                           heights = grobHeight(title) + padding,
                           pos = 0)
  
  table <- gtable_add_grob(table, list(title, subtitle),
                           t=c(1, 2), l=c(1,1), 
                           r=ncol(table))
  png('tmp.png', width = 480, height = 480, bg = "#FFECDB")
  grid.newpage()
  grid.draw(table)
  dev.off()

I wonder if anybody has a suggestion on how to fix it. Thank you


Solution

  • I'm new to grid tables, but it appears the order of your grobs matters, at least for padding. Is this the result you are expecting?

    library(gridExtra)
    library(grid)
    library(gtable)
    
    d <- head(iris)
    table <- tableGrob(d)
    
    title <- textGrob("Title", gp = gpar(fontsize=50))
    subtitle <- textGrob("subtitle", x=0, hjust=0, gp=gpar( fontface="italic"))
    
    table <- gtable_add_rows(table, heights = grobHeight(subtitle) + unit(58,"mm"), pos = 0)
    table <- gtable_add_rows(table, heights = grobHeight(title) - unit(60,"mm"), pos = 0)
    table <- gtable_add_grob(table, list(title, subtitle), t=c(1,2), l=c(1,1), r=ncol(table))
    
    png('tmp.png', width = 480, height = 480, bg = "#FFECDB")
    
    grid.newpage()
    grid.draw(table)
    
    dev.off()
    

    title subtitle 60