2017-01-17 17 views
1

Я сделал 3D-участок в rgl.persp3d, но не знаю, как сгладить это, чтобы увидеть тренд. Или, может быть, следующее решение - реализовать каркас в rgl.persp3d (потому что мне нужно, чтобы этот график был интерактивным). Пожалуйста помоги.Сглаживание 3d участка в R

library(mgcv) 


x<- rnorm(200) 
y<- rnorm(200) 
z<-rnorm(200) 

tab<-data.frame(x,y,z) 
tab 

#surface wireframe: 

mod <- gam(z ~ te(x, y), data = tab) 

wyk <- matrix(fitted(mod), ncol = 20) #8 i 10 też ok 

wireframe(wyk, drape=TRUE, colorkey=TRUE) 

wireframe

#surface persp3d 


library(rgl) 
library(akima) 


z_interpolation <- 200 

tabint <- interp(x, y, z) 

x.si <- tabint$x 
y.si <- tabint$y 
z.si <- tabint$z 
nbcol <- 200 
vertcol <- cut(t, nbcol) 
color = rev(rainbow(nbcol, start = 0/6, end = 4/6)) 
persp3d(x.si, y.si, z.si, col = color[vertcol], smooth=T) 

persp3d

Так каркасном не является ни сглажены, ни интерактивный ... и rgl.persp3d является интерактивной, но не сглажены. И я не могу иметь как сглаженные, так и интерактивные.

ответ

2

rgl просто рисует то, что вы ему даете. Вам нужно использовать mgcv, как в первом примере для сглаживания, но в конце вы не получите матрицу вставленных значений, поэтому вы хотите использовать deldir, чтобы превратить результаты в поверхность. Например,

library(mgcv) 

x<- rnorm(200) 
y<- rnorm(200) 
z<-rnorm(200) 

tab<-data.frame(x,y,z) 
tab 

#surface wireframe: 

mod <- gam(z ~ te(x, y), data = tab) 

library(rgl) 
library(deldir) 

zfit <- fitted(mod) 
col <- cm.colors(20)[1 + 
     round(19*(zfit - min(zfit))/diff(range(zfit)))] 

persp3d(deldir(x, y, z = zfit), col = col) 
aspect3d(1, 2, 1) 

Это дает хорошую гладкую поверхность, например

enter image description here