[R]: (Lattice): Overlaying more than one trend surface using contourplot() and wireframe()

Deepayan Sarkar deepayan at stat.wisc.edu
Fri Aug 6 19:06:38 CEST 2004

On Friday 06 August 2004 10:47, Peter Ho wrote:
> Hi,
> Is there a way to plot more than one trend surface using the
> functions contourplot() and wireframe(). I have found an add=T in
> contour(), but no equivalent argument in contourplot() and
> wireframe()?
> I have taken the example 11-2 (pages 441-451) from Design and
> analysis of experiments (Montgomery  2001, 5th edition) to see if
> this could be done in R. I have managed to plot individual  contours
> for each response after using the surf.ls() and trmat() functions
> from the Spatial package, but have been unable to overlay the
> contours.   Ideally, it would be nice to also choose a different set
> of colours for shading the surface, so that when combing surfaces, we
> can immediately identify the optimum conditions. The final overlaid
> plot is shown on page 451 (Figure 11-16) of the book.

I don't have access to that book, so a scan or a rough sketch of what 
that looks like would be helpful.

Ideally, this sort of thing should be done by using a groups= argument. 
This needs your data to be restructured into a single data frame, e.g.:

trsurfY$z <- as.vector(trsurfY$z)
trsurfV$z <- as.vector(trsurfV$z)
trsurfMW$z <- as.vector(trsurfMW$z)

trsurf.comb <- rbind(as.data.frame(trsurfY),
trsurf.comb$g <- 
    factor(rep(c("Y", "V", "MW"), 
           each = length(trsurfY$x)))

The subsequent call should be like 

contourplot(z ~ x * y, trsurf.comb, groups = g)

Unfortunately, contourplot has no idea how to deal with groups, so you 
will have to tell it by writing your own panel function:

contourplot(z ~ x * y, trsurf.comb, 
            subset = g %in% c("V", "Y"), 
            groups = g, cuts = 30,
            panel = function(..., groups, subscripts) {
                gvals <- levels(groups)
                for (i in gvals)
             subscripts = subscripts[groups[subscripts] == i])
         ## panel.contourplot should also work here,
         ## but doesn't because I forgot to export it

Note that the range of the z-values in your 3rd group (MV) is very 
different from the other 2, so trying to include all 3 won't work 
unless you specify an appropriate 'at' vector that covers the ranges of 
all 3 surfaces (by default it will try to put contours at evenly spaced 
locations over the whole range, almost all of which will miss the 

I have no idea what you were hoping to do with levelplots (where the 
inter-contour regions are colored).

You can do something similar with wireframe to get the 3 surfaces 
together. It does know how to handle groups, so the call is simpler. 
(Note that this doesn't really work if your surfaces intersect, but you 
can usually get by with making the grid fine enough.):

wireframe(z ~ x * y, trsurf.comb, groups = g,
          subset = g %in% c("V", "Y"), shade = TRUE)

Hope that helps,


More information about the R-help mailing list