[R] placing rectangle behind plot

Gabor Grothendieck ggrothendieck at gmail.com
Mon Jul 31 04:24:59 CEST 2006


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/
>
>



More information about the R-help mailing list