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

Peter Ho peter at fe.up.pt
Sat Aug 7 18:29:31 CEST 2004


Thanks alot for your help. I managed to rescale the 3rd response 
variable, which was what Montgomery did in  the example. Plotting the 
3rd surface was as easy as including a 3rd argument for "MW".

The only problem now is to work out how to shade a particlar area of 
interest, depending on selected constrainst for each response. I ´ll  
try working on that next.

Many thanks again


Deepayan Sarkar wrote:

>On Friday 06 August 2004 10:47, Peter Ho wrote:
>>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
>>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),
>                     as.data.frame(trsurfV),
>                     as.data.frame(trsurfMW))
>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)
>                {
>         panel.levelplot(...,
>             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