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 ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.
Hi Patrick Connolly wrote:> 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?Don't pop them ? (use upViewport() instead) Paul -- 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/