[R] Making use of names of viewports (grid)

Patrick Connolly p_connolly at slingshot.co.nz
Sun Aug 17 12:46:27 CEST 2008


The following code, though not brilliant, works on an A4 page.  It
might look odd on other devices of a very different size.

=============X8------- cut here ----------------------------
  require(grid)
  wide <- 15
  vps <- grid.layout(nrow = 3, ncol = 4,
                     widths = unit(rep(1, 4), rep("null", 4)),
                     heights = unit(c(99, 1, 99),
                       c("mm", "null", "mm")))
  pushViewport(viewport(layout = vps))
  for(k in 1:4){# label 4 viewports in top row
    cube.k <- ppaste("Cube", k)
    pushViewport(viewport(layout = vps, name = cube.k,
                          layout.pos.row = 1,
                          layout.pos.col = k))
    grid.rect(gp = gpar(lty = "dashed", lwd = .1))
    grid.text(cube.k, y = .9, gp = gpar(cex = .8))
    popViewport()
  }
## label first viewport in bottom row
  pushViewport(viewport(layout = vps, name = "Cube5",
                        layout.pos.row = 3,
                        layout.pos.col = 1))
  grid.rect(gp = gpar(lty = "dashed", lwd = .1))
  grid.text("Cube5", y = .95, gp = gpar(cex = .8))
## Set up a grid inside Cube5 viewport
  vpc <- grid.layout(nrow = 5, ncol = 4,
                     widths = unit(rep(wide, 4), "mm"),
                     heights = unit(rep(wide, 5), "mm"))
  pushViewport(viewport(layout = vpc))
  for(i in 1:5){
    for(j in 1:4){
      pushViewport(viewport(layout = vpc,  clip = "on",
                            layout.pos.row = i,
                            layout.pos.col = j))
      grid.rect(gp = gpar(col = "red"))
      popViewport()
    }
  }
  ## wipe out the outer edges 
  grid.rect(width = wide * 4, height = wide * 5, default.units = "mm",
            gp = gpar(col = "white"))
  ## cover lines from centre squares
  grid.rect(width = wide * 2, height = wide * 3, default.units = "mm",
            gp = gpar(col = "white", fill = "white"))

=============X8------- cut here ---------------------------- 

I've tried naming the viewports at the time they're pushed.  I had
hoped I could get back to them to do what I've done in 'Cube5' using
something like seekViewport(), but I see that won't work if the
viewport has been popped.

Reading through 'R Graphics' (the blue-toned book), I see there's such
a thing as vpList which I could make while I'm in that for loop,
but I don't see how I could do something like vpL <- c(vpL, cube.k)
sort of thing that I could do with a vector.  It's even less clear how
I could make use of vpStack or vpTree.

What is a smarter way to get back to those upper viewports?

-- 
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.   
   ___    Patrick Connolly   
 {~._.~}          		 Great minds discuss ideas    
 _( Y )_  	  	        Middle minds discuss events 
(:_~*~_:) 	       		 Small minds discuss people  
 (_)-(_)  	                           ..... Anon
	  
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.



More information about the R-help mailing list