2013-08-14 3 views
3

나는 scatter3d()Rcmdr을 사용하여 멋진 플롯을 만들었습니다. 이 플롯에는 두 개의 표면 매끄러움이 있습니다. 이제 (즉, 관측치를 생성하는 함수로 정의 된 표면이 노이즈 성분을 뺀 표면)을 추가하여이 플롯에을 추가하고 싶습니다. 여기 데이터 프레임의 RGL 표면 플롯

지금까지 내 코드입니다 :

다른 스레드에 주어진 솔루션은 다음 함수를 정의하는 것입니다

library(car) 
set.seed(1) 

n <- 200 # number of observations (x,y,z) to be generated 
sd <- 0.3 # standard deviation for error term 
x <- runif(n) # generate x component 
y <- runif(n) # generate y component 

r <- sqrt(x^2+y^2) # used to compute z values 

z_t <- sin(x^2+3*y^2)/(0.1+r^2) + (x^2+5*y^2)*exp(1-r^2)/2 # calculate values of true regression function 

z <- z_t + rnorm(n, sd = sd) # overlay normally distrbuted 'noise' 
dm <- data.frame(x=x, y=y, z=z) # data frame containing (x,y,z) observations 
dm_t <- data.frame(x=x,y=y, z=z_t) # data frame containing (x,y) observations and the corresponding value of the *true* regression function 

# Create 3D scatterplot of: 
# - Observations (this includes 'noise') 
# - Surface given by Additive Model fit 
# - Surface given by bivariate smoother fit 

scatter3d(dm$x, dm$y, dm$z, fit=c("smooth","additive"), bg="white", 
      axis.scales=TRUE, grid=TRUE, ellipsoid=FALSE, xlab="x", ylab="z", zlab="y") 
: 이것은 그러나 오류를 얻을 수

my_surface <- function(f, n=10, ...) { 
    ranges <- rgl:::.getRanges() 
    x <- seq(ranges$xlim[1], ranges$xlim[2], length=n) 
    y <- seq(ranges$ylim[1], ranges$ylim[2], length=n) 
    z <- outer(x,y,f) 
    surface3d(x, y, z, ...) 
} 

f <- function(x, y) 
    sin(x^2+3*y^2)/(0.1+r^2) + (x^2+5*y^2)*exp(1-r^2)/2 

my_surface(f, alpha=0.2) 

을, 말 (이후 독일어 번역 이건 내 시스템 언어입니다. 사과하겠습니다.)

Error in outer(x, y, f) : 
    Dimension [Product 100] does not match the length of the object [200] 

그런 다음 다른 대안을 시도했습니다. ch :

x <- seq(0,1,length=20) 
y <- x 
z <- outer(x,y,f) 
surface3d(x,y,z) 

이것은 플롯에 서페이스를 추가하지만 전혀 보이지 않습니다 (예 : 관측치가 가까이 있지 않습니다.) 다음은 실제 표면이 보이는 모양입니다 (이것은 분명히 잘못되었습니다) : 고마워!

The wrong "true" regression surface

나는 문제가 사실로 확장 할 수있다 생각합니다. 여기에 평면 z = x + y에 앉아있는 몇 가지 점을 만들었습니다.

The scaling issue

은 아마 당신의 일이 나를 도울 수 :

library(car) 

n <- 50 
x <- runif(n) 
y <- runif(n) 
z <- x+y 

scatter3d(x,y,z, surface = FALSE) 

f <- function(x,y) 
    x + y 

x_grid <- seq(0,1, length=20) 
y_grid <- x_grid 
z_grid <- outer(x_grid, y_grid, f) 
surface3d(x_grid, y_grid, z_grid) 

이 나에게 다음과 같은 플롯을 제공합니다 : 그럼 위의 내 방법을 사용하여 비행기를 플롯하려고하는 것을 계속?

+3

당신은 좋은 답변을 받았지만 결코 투표하지 않았거나 답을 수락 한 비슷한 질문을했습니다. 이것은 당신이 지역 사회에 아무 것도주지 않기 때문에 사람들이 당신을 돕기를 꺼리는 것을 만듭니다. SO가 * 추정되는 방법을 보려면 [** Help **] (http://stackoverflow.com/help) 및 [** About **] (http://stackoverflow.com/about) 페이지를 읽으십시오. 작업. –

+0

@ HaskellElephant 나는 * my * 선택에 관해서 아무 말도하지 않았다. 나는 사람들이 결코 지적하지 않은 것을 보았을 때 사람들이 돕기를 꺼려한다고 지적했다. 그 결론을 어디에서 가져 옵니까? 그건 제쳐두고, 제가 의견을 남겼던 시점에서 질문은 코드가없고 재현 할 수없는 예를 포함했습니다. 이제 OP가 훌륭한 재현 가능한 예를 남겨두고 응답을 받음으로써 지역 사회에 대한 더 나은 감각을 갖게되었습니다. (자신의 입장을 통해 문제가 해결되었습니다). 그래서 제 의견은 커뮤니티와 OP의 경험을 풍부하게했습니다. 더 많은 참여 = 더 좋습니다. –

+1

+1 시간을내어이 질문을 편집하십시오. 이것은 이제 훌륭한 재현 가능한 예입니다 ./ –

답변

0

의 기능은 플롯하기 전에 데이터를 재 측정하므로 본질적으로 모든 rgl 플로팅 기능 (surface3d 포함)과 호환되지 않습니다.

모든 rgl 기능을 사용하여 원하는 것과 같은 그림을 얻을 수 있습니다. scatter3d 대신 plot3d(x, y, z)을 사용하지만 물론 car- 스타일 축 대신 rgl- 스타일 축이 있습니다.

관련 문제