[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