[R] Rotated viewports in Grid

Paul Murrell paul at stat.auckland.ac.nz
Wed Oct 24 14:42:55 CEST 2007


Gustaf Rydevik wrote:
> Hi all,
> I'm trying to generate a plot containing a scatterplot, with marginal
> densityplots for x and y.
> However, when I try to generate a vertical densityplot, I get the
> message "warning: can't clip to rotated viewport", and nothing shows
> up. I'm probably misunderstanding how viewports are meant to be used,
> so if someone could give me a hint, I'd be most grateful.
> my system is R 2.5.0 (stuck, and can't upgrade for now) and windoms xp.

The warning says it all unfortunately;  R only clips to rectangular 
regions, so if you take a rectangle (viewport) and rotate it, and try to 
clip to it, R can't cope (it's lattice that is trying to clip to some of 
its viewports BTW).

Of course, R could be slightly smarter and check whether the rotated 
rectangle is still a rectangle (aligned with the x- and y-axes).  I will 
look at a fix for this in the development version of R.

Unfortunately, there are still some problems with your example, because ...


... will not do what you want.  The layout.pos.row/col mean that angle 
(along with x, y, width, and height) is ignored.  Instead you could try ...

pushViewport(viewport(width=convertUnit(unit(1, "npc"),
                         "npc", "y", "dimension", "x"),
                       height=convertUnit(unit(1, "npc"),
                         "npc", "x", "dimension", "y"),

... (all that conversion is necessary because otherwise the rotated 
viewport is NOT the size you probably want).

However, even then the result is not very nice because you have a lot of 
work still to do to make the x- and y-scales on the three plots line up 
(not just a matter of controlling the scales on each plot, but also a 
matter of getting the plot margins the same size).

If it was me, I would be starting to think about writing something from 
scratch in grid at this point ...


> many thanks in advance,
> Gustaf
> example:
> --------------------------
> library(lattice)
> library(grid)
> x<-rnorm(20)
> y<-rnorm(20)
> graph.layout<-grid.layout(nrow=2,ncol=2,widths=unit.c(unit(2,"null"),unit(1,"null")),heights=unit.c(unit(1,"null"),unit(2,"null")))
> graph.view<-viewport(layout=graph.layout,name="root")
> grid.newpage()
> pushViewport(gap.view)
> pushViewport(viewport(layout.pos.row=2,layout.pos.col=1))
> print(xyplot(x~y),newpage=FALSE)
> popViewport()
> pushViewport(viewport(layout.pos.row=1,layout.pos.col=1))
> print(densityplot(x),newpage=FALSE)
> popViewport()
> pushViewport(viewport(layout.pos.row=2,layout.pos.col=2,angle=270))
> print(densityplot(y),newpage=FALSE) ### I Get the warning message here.
> ----------------------------------

Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
New Zealand
64 9 3737599 x85392
paul at stat.auckland.ac.nz

More information about the R-help mailing list