[R] How to generate a smoothed surface for a three dimensional dataset?

Duncan Murdoch murdoch.duncan at gmail.com
Fri Dec 6 03:03:55 CET 2013


On 13-12-05 7:02 PM, Jun Shen wrote:
> Thanks again, Duncan. Please allow me to ask one more question. Is it
> possible to generate a contour plot overlaying with the plot3d() plot?

Yes, the contourLines function from grDevices can calculate the lines, 
then you can use rgl::lines3d to draw them.

Duncan Murdoch

>
> Jun
>
>
> On Thu, Dec 5, 2013 at 11:08 AM, Duncan Murdoch
> <murdoch.duncan at gmail.com <mailto:murdoch.duncan at gmail.com>> wrote:
>
>     On 05/12/2013 10:33 AM, Jun Shen wrote:
>
>         Hi Federico/Duncan/David/Bert,
>
>         Thank you for your thoughtful comments and it's a great learning
>         experience. I can see the critical point here is to find a right
>         function
>         to make the prediction. So I was thinking to start with "loess".
>         However
>         the predict.loess gave me an error as follows
>
>         Error in `$<-.data.frame`(`*tmp*`, "z", value = c(0.417071766265867,
>         0.433916401753023,  :
>             replacement has 20 rows, data has 400
>
>         Here is the code I tried. Thank you for your help again!
>
>         Jun
>         ==============================__=======
>
>         x<-runif(20)
>         y<-runif(20)
>         z<-runif(20)
>
>         library(rgl)
>         plot3d(x,y,z)
>
>         loess(z~x+y,control=loess.__control(surface='direct'),__span=.5,degree=2)->fit.loess
>
>         xnew <- seq(min(x), max(x), len=20)
>         ynew <- seq(min(y), max(y), len=20)
>
>         df <- expand.grid(x = xnew, y = ynew)
>
>         df$z<-predict(fit.loess,__newdata=df)
>
>
>     After the error, use traceback() to find which function called
>     `$<-.data.frame`.  It shows that it was your final assignment
>
>     df$z<-predict(fit.loess,__newdata=df)
>
>
>     which causes the error, because the predict function returns a
>     matrix.  So you can get the plot using
>
>     surface3d(xnew, ynew, predict(fit.loess,newdata=df), col="gray")
>
>     You may want
>
>     aspect3d(1,1,1)
>
>     afterwards; loess isn't so good at extrapolation.  Or you may want
>     to set predictions to NA outside the convex hull of your data.  (I'm
>     not sure which function is easiest to calculate that, but here's one
>     way:
>
>     hullx <- x[chull(x,y)]
>     hully <- y[chull(x,y)]
>     keep <- sp::point.in.polygon(df$x, df$y, hullx, hully)
>     znew <- predict(fit.loess,newdata=df)
>     znew[!keep] <- NA
>     plot3d(x,y,z)
>     surface3d(xnew, ynew, znew, col="gray")
>     aspect3d(1,1,1)
>
>
>
>



More information about the R-help mailing list