tableGrob: set the height and width of a grid.table

16,791

Solution 1

The solution I went with was to manipulate the length of the levels like this:

 longest <- 0
 longestnumber <- 0

 for (i in 1:length(levels(x))){

  if (longest < nchar(levels(x))[i]){
  longest <- nchar(levels(x))[i] 
  longestnumber <- i
  } 
   }

 for (i in 1:(100-longest)){
  levels(x)[longestnumber] <- paste(levels(x)[longestnumber], " ", sep="")
  }

That way I can control the width of the table

Solution 2

The current version of gridExtra::tableGrob doesn't let you set the widths/heights. You can however try a different (experimental) version of tableGrob built from scratch using gtable.

#library(devtools)
#install_github("tablegrob", "baptiste")
require(tablegrob)

d <- iris[sample(seq.int(nrow(iris)), 6),]

grid.newpage()
pushViewport(viewport(height=0.8,width=0.9))
g2 <- tableGrob(d, rows=NULL,
                widths=unit(1,"null"), heights=unit(1/(nrow(d)),"npc"))
grid.draw(g2)
grid.roundrect(y=unit(0,"line"), height=unit(1,"npc") +unit(1,"lines"),
               just="bottom", r=unit(0.05, "snpc"))

Edit (08/2015): you can now edit the widths/heights, since grid.table is now based on gtable.

Share:
16,791
Einnor
Author by

Einnor

MA in sociology

Updated on June 09, 2022

Comments

  • Einnor
    Einnor almost 2 years

    I'm trying to make a function that will give me a plot ready for indesign, illustrator or inkscape. In trying to do so, I have 2 problems I cannot solve.

    1) set the width and height of my plot (or just the grobTable): The output I get is very small and when upscaling it in illustrator the font follows and become way to big. Therefore I want to make plots with manually defined widths and heights.

    2) Sometimes the title, note and rownames gets "misplaced" (see the difference between plot 1 and 2 for details). It happens when the rownames are short.

    library(gridExtra)
    library(ggplot2)
    
    data(diamonds)
    
    ## plot function
    
    kryds.row <- function(x,y, p=100, decor="%", digits=3,
                      titel="", note="", red=219, green=55, blue= 153){
    
    c <- table(x, y)
    s <- as.character(sum(c))
    s <- paste("Antal svarpersoner=", s, sep=" ")
    j <- prop.table(c,1)
    r <- c(rownames(j),"Total")
    k <- c(colnames(j), "Total")
    j <- addmargins(j, margin =2, FUN = sum)
    j <- round(j, digits)
    j[]<-paste(j*p, decor, sep=" ")
    
    farve <- rgb(red,green,blue, maxColorValue =255)
    
    table     <-   tableGrob(j,
                           cols = k,
                           gpar.coretext = gpar(fontsize = 12),            
                           gpar.coltext  = gpar(fontsize = 12,col="white"),            
                           gpar.rowtext  = gpar(fontsize = 12, fontface="bold"),            
                           gpar.corefill = gpar(fill = rgb(255,255,255, maxColorValue      =255), alpha = 1, col = NA),
                           gpar.rowfill  = gpar(fill = rgb(255,255,255, maxColorValue =255), alpha = 1, col = NA),           
                           gpar.colfill  = gpar(fill = 0, alpha = 1 ,col= "white"),                       
                           equal.width   = TRUE,            
                           show.rownames = TRUE,            
                           show.rsep     = TRUE, 
                           show.hlines   = TRUE,                               
                           show.csep     = FALSE, 
                           show.vlines   = FALSE,
                           show.box      = FALSE,
                           padding.h     = unit(15, "mm"),            
                           padding.v     = unit(8, "mm"),
                           core.just     = "center", 
                           row.just      = "left",
                           separator     = farve)
    
    
     hh <- grobHeight(table)
     ww <- grobWidth(table)
    
     border <- roundrectGrob(x=0.5, y=0.5, width=ww, height=hh,
                          default.units="npc",
                          r=unit(0.1, "snpc"),
                          just="centre",
                          name=NULL, gp=gpar(col="white", fill=farve, vp=NULL)) 
    
     border2 <- roundrectGrob(x=0.5, y=0.5, width=ww, height=hh,
                           default.units="npc",
                           r=unit(0.1, "snpc"),
                           just="centre",
                           name=NULL, gp=gpar(fill=NA, col=farve, vp=NULL))
    
     title <- textGrob(titel,
                    x=unit(0.5,"npc") -0.5*ww + unit(5, "mm"), 
                    y=unit(0.5,"npc") +0.5*hh + unit(2, "mm"), 
                    vjust=0,hjust=0, gp=gpar(fontsize=12, fontface="bold"))
    
     footnote <- textGrob(note, 
                       x=unit(0.5,"npc") - 0.5*ww + unit(5,"mm"),
                       y=unit(0.5,"npc") - 0.5*hh, 
                       vjust=1, hjust=0,gp=gpar( fontsize=10))
    
     svarpersoner       <- textGrob(s, 
                                 x=unit(0.5,"npc") + 0.5*ww -unit(5, "mm"),
                                 y=unit(0.5,"npc") + 0.5*hh + unit(2, "mm"), 
                                 vjust=0, hjust=1,gp=gpar( fontsize=10))
     grid.newpage()
     gt <- gTree(children=gList(border,table,border2, title, footnote, svarpersoner))
     grid.draw(gt)
    
    }
    
    
    
    # Plot it 
    kryds.row(diamonds$color, diamonds$cut, titel="title", note="note") # plot 1
    kryds.row(diamonds$cut, diamonds$color, titel="title", note="note") # plot 2
    
    
    # Problems
    #1: The title, note and the j in the row.text is very badly placed in plot 1 but not   plot 2
    #2 I cannot set the width and height of my table
    

    I have not cleaned up in my code yet, so please bare with it!

  • Einnor
    Einnor almost 11 years
    @Baptiste is the width af a Tablegrob dependent on how many rows it has?