[R] xyplot() and controlling panel.polygon()

Deepayan Sarkar deepayan.sarkar at gmail.com
Fri Apr 27 22:14:40 CEST 2007

On 4/27/07, Michael Kubovy <kubovy at virginia.edu> wrote:
> Hi Deepayan,
> Your solution works, anf the polygon are drawn where I wanted them to
> go. I thought that I could figure out how to gain control over the
> colors of the four ensuing polygons (I'm trying to get two lighter
> shades of the lines).
> I've tried, for example, to see if I could control the color of the
> polyon outline, by adding border = 'red' to panel.polygon. That
> didn't work. Does it work only in lpolygon()?

No. This is a bug, and the border color can currently only be black or
transparent (but it's easy to find and fix the bug; lpolygon is very
short, so just write a replacement).

However, panel.superpose recognizes and splits certain graphical
parameters; border is not among them, but fill is. So you could do:

my.panel.bands <-
    function(x, y, upper, lower,
             fill, col,
             subscripts, ..., font, fontface)
    upper <- upper[subscripts]
    lower <- lower[subscripts]
    panel.polygon(c(x, rev(x)), c(upper, rev(lower)),
                  col = fill, border = FALSE,

xyplot(est ~ x | cond, group = grp, data = data, type = 'b',
       col = c("#0080ff", "#ff00ff"),
       fill = c("#bbddff", "#ffbbff"),
       upper = data$upper,
       lower = data$lower,
       panel = function(x, y, ...){
           panel.superpose(x, y, panel.groups = 'my.panel.bands', ...)
           panel.xyplot(x, y, ...)

> I often can figure things out on my own, but obviously there's
> something fundamental that I'm not getting about inheritance and
> passing in these sorts of objects. I've been trying to get it from
> the help pages and from Murrell's book, but neither offers enough of
> a cookbook for me to figure these things out. Is there something I
> should have read?

The concepts are all there in the help page (but it's often difficult
to put them together). The main points are:

(1) unrecognized arguments get passed on to the panel function as is
(2) subscripts give indices of x, y, etc in the original data frame

(the implication being that if you have another column from the
original data frame, such as upper and lower in your example, indexing
by subscripts will give you the matching subset). Other than that, the
panel functions have to do their own work (and what they do should
ideally be documented); nothing is enforced, so nothing is guaranteed.

This sort of thing doesn't get used often enough for examples to be
easily found. The following demo in lattice might be helpful.

file.show(system.file("demo/intervals.R", package = "lattice"))


More information about the R-help mailing list