Gabor Grothendieck
2005-Oct-11 07:43 UTC
[R] aligning column of xyplots and removing space between them
The code below displays three graphs in three rows and one column but: 1. I want to remove the space between the graphs (I tried playing with positionarg to print.trellis but it seems quite difficult to get the right values and all my attempts had space between them or had overlapping graphs. Is there a better way to do this? 2. the widths of the plots are not the same even though I specified the same xlim= to them all. How do I make them the same? 3. how do I get rid of the ticks at the top of the bottom plot? 4. the bottom graph is supposed to plot 1:3 against itself but the third point is not showing even though I specified ylim = c(0,3). Must I specify ylim = c(0,3+1) or is there a better way? Here is the code (its a modified version of some code that I previously posted regarding a different question): ### everything from here to the grid.newpage line is just ### to set up the viewports for the graphs so you ### can just go to the comment that says ### 'relevant part starts here' library(grid) library(lattice) trellis.par.set(theme = col.whitebg()) grid.newpage() pushLayout <- function(nr, nc, ..., name="layout") { pushViewport(viewport(layout=grid.layout(nr, nc, ...), name=name)) for (i in 1:nr) { for (j in 1:nc) { pushViewport(viewport(layout.pos.row=i, layout.pos.col=j)) upViewport() } } upViewport() } with.vpPath <- with.viewport <- function(data, expr, ...) { # if data is a vpPath it cannot be ROOT since NULL will not dispatch here depth <- if (data$name == "ROOT") 0 else downViewport(data$name) result <- eval.parent(substitute(expr)) upViewport(depth) invisible(result) } grid.newpage() # n and nr are number of cells and rows n <- nr <- 3 nc <- 1 # must be 1 heights <- unit(c(2, rep(1, nr-1)), "null") downViewport(pushLayout(nr, nc, heights = heights)) vpt <- current.vpTree(all = FALSE) ### relevant part starts here ######################### xlab <- main <- function(x) if (x) "v" for(k in 1:n) with(vpt$children[[k]], print( xyplot(v ~ v, list(v = 1:k), xlab = xlab(k == n), xlim = c(0,n), ylim = c(0,n), main = main(k == 1), scales = list(x = list(draw = k == n), y = list(alternating = 3))), newpage = FALSE) )
Deepayan Sarkar
2005-Oct-11 20:42 UTC
[R] aligning column of xyplots and removing space between them
On 10/11/05, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:> The code below displays three graphs in three rows and one column but: > > 1. I want to remove the space between the graphs (I tried playing with position> arg to print.trellis but it seems quite difficult to get the right > values and all > my attempts had space between them or had overlapping graphs. Is > there a better way to do this?Define theme.novpadding <- list(layout.heights list(top.padding = 0, main.key.padding = 0, key.axis.padding = 0, axis.xlab.padding = 0, xlab.key.padding = 0, key.sub.padding = 0, bottom.padding = 0)) and then add par.settings = theme.novpadding to all your xyplot calls.> 2. the widths of the plots are not the same even though I specified the same > xlim= to them all. How do I make them the same?They seem to be the same for me, but they might be different if the y-axis labels are different. See the 'panel.width' argument in ?print.trellis.> 3. how do I get rid of the ticks at the top of the bottom plot?add scales = list(x = list(relation = "free"))> 4. the bottom graph is supposed to plot 1:3 against itself but the third > point is not showing even though I specified ylim = c(0,3). Must > I specify ylim = c(0,3+1) or is there a better way?There's no better way. This behaviour is intentionally different from base graphics. Here's a modified version of the last part of your code: grid.newpage() # n and nr are number of cells and rows n <- nr <- 3 nc <- 1 # must be 1 heights <- unit(c(2, rep(1, nr-1)), "null") downViewport(pushLayout(nr, nc, heights = heights)) vpt <- current.vpTree(all = FALSE) ### relevant part starts here ######################### xlab <- main <- function(x) if (x) "v" for(k in 1:n) with(vpt$children[[k]], print( xyplot(v ~ v, list(v = 1:k), xlab = xlab(k == n), xlim = c(0,n), ylim = c(0,n), main = main(k == 1), par.settings = theme.novpadding, scales = list(x = list(draw = k == n, relation = "free", c(1, 0)), y = list(alternating = 3))), newpage = FALSE, panel.width = list(x = 4, units = "inches")) ) -Deepayan