tableGrob: set the height and width of a grid.table
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.
Comments
-
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 almost 11 years@Baptiste is the width af a Tablegrob dependent on how many rows it has?