Re: [R] placing rectangle behind plot

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Mon 31 Jul 2006 - 13:18:33 EST

Just to answer my own question I just discovered trellis.panelArgs() and that can be used to give the following solution:

  library(lattice)
  library(grid)
  x <- 1:10
  xyplot(x ~ x | gl(2,1), layout = 1:2)
  trellis.focus("panel", 1, 1)
  grid.rect(w = 0.5, gp = gpar(fill = "light grey"))   # re-plot panel over rectangle
  do.call("panel.xyplot", trellis.panelArgs())   trellis.unfocus()

nevertheless, as a point of general interest I would still be interested to know
what a general grid-based solution might be.

On 7/30/06, Gabor Grothendieck <ggrothendieck@gmail.com> wrote:
> 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@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@stat.auckland.ac.nz
> > http://www.stat.auckland.ac.nz/~paul/
> >
> >
>



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Mon Jul 31 13:29:13 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Mon 31 Jul 2006 - 16:17:58 EST.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.