placing rectangle behind plot
Thanks. That's helpful.
I would be interested in the case where
1. one does not have a variable latticeplot, as per your example,
but just has the output of
xyplot(x ~ x | gl(2,1), layout = 1:2)
sitting on the screen, having been "printed" by a prior
function. We can assume that no other graphics have been
issued since then. Can one still create a grey rectangle behind
the lower panel?
2. In fact, ideally what I would like is to create a function,
put.in.bg, say, that works something like this:
xyplot(x ~ x | gl(2,1), layout = 1:2)
trellis.focus("panel", 1, 1)
put.in.bg(grid.rect(w = 0.5))
trellis.unfocus()
or maybe
xyplot(x ~ x | gl(2,1), layout = 1:2)
trellis.focus.bg("panel", 1, 1)
grid.rect(w = 0.5)
trellis.unfocus()
That allows one to add objects to a lattice panel behind the objects
that are already there. This would also be helpful for adding grid
lines afterwards or other lines, rectangles, etc.
On 7/30/06, Paul Murrell <p.murrell at auckland.ac.nz> wrote:
Hi Gabor Grothendieck wrote:
I am trying to create a lattice plot and would like to later, i.e. after the plot is drawn, add a grey rectangle behind a portion of it. The following works except that the rectrangle is on top of and obscures a portion of the chart. I also tried adding col = "transparent" to the gpar list but that did not help -- I am on windows and perhaps the windows device does not support transparency?
Correct.
At any rate, how can I place the rectangle behind the plotted
points without drawing the rectangle first?
library(lattice)
library(grid)
trellis.unfocus()
x <- 1:10
xyplot(x ~ x | gl(2,1), layout = 1:2)
trellis.focus("panel", 1, 1)
grid.rect(w = .5, gp = gpar(fill = "light grey"))
trellis.unfocus()
The user-interface is a little rough, but this can be done by accessing
the underlying grid objects. Here's an example, with explanatory bits
interspersed ...
# "grab" the lattice plot as a grid gTree
# There are warnings, but they are ignorable
latticeplot <- grid.grabExpr(print(xyplot(x ~ x | gl(2,1),
layout = 1:2)))
# Demonstrate that the gTree faithfully replicates the
# original lattice plot (not necessary, just to to what's going on)
grid.newpage()
grid.draw(latticeplot)
# Explore the gTree (just to to show what's going on)
# Better user-interface would be nice here ...
childNames(latticeplot)
# Identify which children are which
# (appropriate grob names would be nice here)
lapply(latticeplot$children, class)
# Identify where each child is drawn
latticeplot$childrenvp
lapply(latticeplot$children, "[[", "vp")
# Add a rect (starts off on top of everything else)
# NOTE that rect has to have correct vpPath
plotwithrect <- addGrob(latticeplot,
rectGrob(w = .5, gp = gpar(fill = "light grey"),
vp=vpPath("plot1.toplevel.vp",
"plot1.panel.1.1.vp")))
# Check this draws what we expect (just to show what's going on)
grid.newpage()
grid.draw(plotwithrect)
# Reorder children to put rect at back
# Appropriate user-interface would be nice here ...
nc <- length(plotwithrect$childrenOrder)
plotwithrect$childrenOrder <-
plotwithrect$childrenOrder[c(nc, 1:(nc - 1))]
# Final result
grid.newpage()
grid.draw(plotwithrect)
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/