[R] grid.layout?
Paul Murrell
p.murrell at auckland.ac.nz
Tue Mar 4 20:48:38 CET 2008
Hi
Patrick Connolly wrote:
> platform x86_64-unknown-linux-gnu
> arch x86_64
> os linux-gnu
> system x86_64, linux-gnu
> status
> major 2
> minor 6.2
> year 2008
> month 02
> day 08
> svn rev 44383
> language R
> version.string R version 2.6.2 (2008-02-08)
>
> The following code does almost everything I want except the red
> rectangle should be aligned flush with square. There's something I
> haven't understood about the grid.layout function. The second time I
> use it, it does what I expect, but there's something wrong with the
> first one.
The crucial misunderstanding is that you push a viewport with a layout
THEN you push other viewports that occupy parts of that layout.
> require(grid)
> N <- 5
> variates <- LETTERS[1:N]
> grid.newpage()
> plot.square <- 2 * length(variates)# cm
> text.wid <- 3 # cm
> vp <- grid.layout(nrow = 1, ncol = 2,
> widths = c(text.wid, plot.square),
> heights = plot.square, default.units = "cm")
This is wrong ...
> pushViewport(viewport(layout = vp, layout.pos.row = 1,
> layout.pos.col = 2))
... should be ...
pushViewport(viewport(layout = vp)) # this viewport defines the layout
> ##
> vpp <- grid.layout(nrow = length(variates),
> ncol = length(variates),
> widths = 2, heights = 2,
> default.units = "cm")
Here is where you specify a position within the previous layout, NOT ...
> pushViewport(viewport(layout = vpp))
... BUT ...
pushViewport(viewport(layout = vpp,
layout.pos.row = 1, # this viewport is placed
layout.pos.col = 2)) # within the above layout
> for(i in seq(variates)){
> for(j in seq(variates)){
Again, this guy should just specify a position within the parent layout ...
> pushViewport(viewport(layout = vpp, layout.pos.col = j,
> layout.pos.row = i))
... no need for the layout here ...
pushViewport(viewport(layout.pos.col = j, # No need for layout
layout.pos.row = i))
> grid.rect(gp=gpar(lty='dashed'))
> popViewport(1)
> }
> }
> popViewport(1)
> pushViewport(viewport(layout = vp, layout.pos.col = 1,
> layout.pos.row = 1))
BTW, did you mean lwd ... ?
> grid.rect(gp=gpar(col = "red", width = 3))
grid.rect(gp=gpar(col = "red", lwd = 3)) # 'lwd' not 'width'
Paul
> ylab.pos <- seq(variates)/length(variates)
> ylab.pos <- ylab.pos - ylab.pos[1]/2
> for(i in seq(variates)){
> grid.text(rev(variates)[i], x = 0.9, gp=gpar(cex = .8),
> y = ylab.pos[i], default.units = "npc",
> just="right")
> }
>
>
> Suggestions about the more intelligent use of pushViewport and
> popViewport would also be appreciated.
>
> Thank you.
>
--
Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
Auckland
New Zealand
64 9 3737599 x85392
paul at stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/
More information about the R-help
mailing list