[R] Location of grobs etc on lattice output

Deepayan Sarkar deepayan at stat.wisc.edu
Mon Nov 22 00:54:54 CET 2004


On Sunday 21 November 2004 16:35, John Maindonald wrote:
> I'm puzzled about side effects of trellis.unfocus():
>
> The following runs without problem, though grid.text() does not
> seem to do anything.  (I'd thought that I had it working at one
> point.)
>
>      library(DAAG); library(lattice); library(grid)
>      cuckoos.strip <- stripplot(species ~ length, xlab="",
> data=cuckoos) cuckoos.bw <- bwplot(species~length, xlab="Length of
> egg (mm)", data=cuckoos)
>      vp0 <- viewport(layout=grid.layout(2, 1))
>      pushViewport(vp0)
>      vp1 <- viewport(layout.pos.row=1)
>      vp2 <- viewport(layout.pos.row=2)
>      pushViewport(vp1)
>      print(cuckoos.strip,newpage=FALSE)
> #   trellis.focus("panel", row=1, column=1, clip.off=TRUE)
>      grid.text("A", x=unit(0,"native"), y=unit(1.05,"native"),
>                gp=gpar(fontsize=9))

I think you want "npc" rather than "native" here. x=0 on the native 
scale is outside the device area.

> #   trellis.unfocus()  ## & remove the following upViewport()
>      upViewport()
>      pushViewport(vp2)
>      print(cuckoos.bw, newpage=FALSE)
>      trellis.focus("panel", row=1, column=1, clip.off=TRUE)
>      grid.text("B", x=unit(0,"native"), y=unit(1.05,"native"),
>                gp=gpar(fontsize=9))
>      trellis.unfocus()
>
> If I remove the #'s, and remove the upViewport() that
> follows the second #, I seem to lose the current tree,
> as though the newpage=FALSE for the next print()
> is ignored.  Should I be able to do something like this?
> Clearly I do not understand what happens when
> trellis.focus() is invoked.

This is a bug in trellis.unfocus, caused by my not reading grid 
documentation carefully enough, I didn't notice that upViewport(0) 
jumps to the root viewport instead of going up 0 viewports. I'll post 
an update soon.

Quick fix:

assignInNamespace("trellis.unfocus", ns = "lattice",
                  value = function()
{
    if (lattice:::lattice.getStatus("vp.highlighted"))
    {
        grid.remove("lvp.highlight", warn = FALSE)
        lattice:::lattice.setStatus(vp.highlighted = FALSE)
    }
    lattice:::lattice.setStatus(current.focus.column = 0,
                      current.focus.row = 0)
    if (lattice:::lattice.getStatus("vp.depth") > 0)
        upViewport(lattice:::lattice.getStatus("vp.depth"))
    lattice:::lattice.setStatus(vp.depth = 0)
    invisible()
})



> This seems an area where an effective GUI, with a
> graphical display of the viewport tree, could be very
> helpful.

True, but it may be overkill for the amount of use it would get.

Deepayan




More information about the R-help mailing list