[R] Draw level lines on the surface of a bivariate function

Duncan Murdoch murdoch at stats.uwo.ca
Sat Mar 11 19:03:06 CET 2006


On 3/11/2006 12:17 PM, Cuvelier Etienne wrote:
> Hello,
> Is it possible to draw level lines  on the surface of a bivariate function?
> 
> In the following example, to draw surface and levels lines for a 
> multivariate normal law,
> I use persp, trans3d, contourLines and lines,
> but if  the lines are correctly drawn, some parts of them are, of 
> course, visible
> even if they are drawn on a non visible "face".
> 
> Any suggestion to avoid this problem ?

You could try to work out which parts of the contour should be hidden, 
based on their direction---but that's probably hard.

You could try the rgl package, but you'll need some fiddling, because 
when you draw lines at the same place you've drawn a surface, it's 
mostly rounding error that determines which one shows up.  rgl also 
doesn't do the automatic rescaling that persp does.  However, this code 
does something pretty close to what you want:

library(rgl)
open3d()
bg3d("white")
surface3d(x,y,20*z,col='red')
for (i in 1:length(lev))
   lines3d(lev[[i]]$x, lev[[i]]$y, 20*lev[[i]]$level+0.01, col='black')
bbox3d(back='lines',xat=pretty(range(x)), yat=pretty(range(y)), 
zat=pretty(range(z))*20, zlab=pretty(range(z)))

Duncan Murdoch

> Thank you
> 
> Etienne
> 
> Example :
> 
> trans3d <- function(x,y,z, pmat)
> {
>    tr <- cbind(x,y,z,1) %*% pmat
>    list(x = tr[,1]/tr[,4], y= tr[,2]/tr[,4])
> }
> 
> mean1 = c(2,4)
> cov1 = matrix(c(0.7, 0.2,0.2,0.7), ncol=2)
> 
> x = seq(0, 5, by = 0.1)
> y = seq(0,10, by= 0.1)
> z = matrix(nrow = length(x), ncol=length(y))
> 
> for(i in 1:length(x))
>   for(j in 1:length(y))
>   {
>     z[i,j]=dmvnorm(c(x[i],y[j]),mean1,cov1)
>   }
> 
> pmat1 = persp(x, y, z, col= "red",shade = 0.25, border=NA)
> 
> lev =contourLines(x,y,z, nlevel = 10)
> for(i in 1:length(lev))
>   lines(trans3d(lev[[i]]$x, lev[[i]]$y, lev[[i]]$level, pmat1), col="black")
> 
> 
> --
> 
> ______________________________________________
> R-help at 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




More information about the R-help mailing list