Location of grobs etc on lattice output
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