[R] packGrob and dynamic resizing
baptiste auguie
baptiste.auguie at googlemail.com
Sat Sep 26 13:10:56 CEST 2009
Hi,
I just tried a fourth variant, closer to what ggplot2 uses (I think):
to each grob is assigned a viewport with row and column positions (in
my example during their construction, with ggplot2 upon editing), and
they're all plotted in a given grid.layout. The timing is poor
compared to pushing and upping viewports (twice as long).
Why would that be?
All the best,
baptiste
(the full, self-contained comparison file is attached, run as:
R --vanilla -f comparison.r )
# below is version 4 only
makeContentInVp <- function(d){
content <- as.character(unlist(c(d)))
nc <- ncol(d)
nr <- nrow(d)
n2nm <- function(nr, nc){
expand.grid(seq(1, nr), seq(1, nc))
}
vp.ind <- n2nm(nr, nc)
textii <- function(d, gp=gpar(), name="content-label-"){
function(ii)
textGrob(label=d[ii], gp=gp,
name=paste(name, ii, sep=""),
vp=viewport(layout.pos.row=vp.ind[ii, 1],
layout.pos.col=vp.ind[ii, 2]))
}
makeOneLabel <- textii(d=content, gp=gpar(col="blue"))
lg <- lapply(seq_along(content), makeOneLabel)
list(lg=lg, nrow=nrow(d), ncol=ncol(d))
}
## table4 uses grobs that already have a viewport assigned
table4 <- function(content){
padding <- unit(4, "mm")
lg <- content$lg
## retrieve the widths and heights of all textGrobs
wg <- lapply(lg, grobWidth) # list of grob widths
hg <- lapply(lg, grobHeight) # list of grob heights
## concatenate this units
widths.all <- do.call(unit.c, wg) # all grob widths
heights.all <- do.call(unit.c, hg) #all grob heights
## matrix-like operations on units to define the table layout
widths <- colMax.units(widths.all, content$ncol) # all column widths
heights <- rowMax.units(heights.all, content$nrow) # all row heights
vp <- viewport(layout=grid.layout(content$nrow,content$ncol,
w=widths+padding, h=heights+padding))
grid.draw(gTree(children=do.call(gList, lg), vp=vp))
}
# uncomment for timing
d <- head(iris)
#d <- iris
content2 <- makeContentInVp(d)
# grid.newpage()
# system.time(table3(content))
## user system elapsed
## 4.422 0.091 4.787
grid.newpage()
system.time(table4(content2))
## user system elapsed
## 8.810 0.184 9.555
2009/9/25 hadley wickham <h.wickham at gmail.com>:
>
> This matches my experience with ggplot2 - I have been gradually moving
> away from frameGrob and packGrob because doing the placement myself is
> much faster (and for most of the cases I'm interested in, the full
> power of packGrob is not needed)
>
> Hadley
>
> --
> http://had.co.nz/
>
More information about the R-help
mailing list