2012-08-09 45 views
8

Chức năng curve trong R cung cấp một cách đơn giản để vẽ một hàm. Ví dụ, điều này sẽ vẽ một đường thẳngTương đương 3D của hàm đường cong trong R?

f1 <- function(x) x 
curve(f1, from=-1, to=1) 

Có một chức năng tương đương trong R mà phải mất một chức năng với hai tham số (ví dụ, xy) và dao động cho cả hai biến và tạo ra một cốt truyện 3D?

Ví dụ, hãy tưởng tượng tôi đã có chức năng sau

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

Có một câu lệnh tương tự như sau?

curve_3d(f2, x_range=c(-1, 1), y_range=c(-1, 1)) 

Trả lời

7

Các surface3d chức năng trong gói: RGL trông giống như một trận đấu tốt. Nó sẽ rất đơn giản để tạo ra một wrapper mà sẽ có chức năng của bạn, tạo ra một bộ x-y của vectơ với seq() và sau đó vượt qua những vectơ để outer với f2 của bạn như là đối số FUN, và sau đó gọi surface3d.

Ngoài ra còn có một persp3d mà các tác giả (Duncan Murdoch và có lẽ những người khác) nói là "cấp cao hơn" và nó dường như thêm trục theo mặc định mà surface3d không.

curve_3d <- function(f2, x_range=c(-1, 1), y_range=c(-1, 1), col=1:6){ 
     if (!require(rgl)) {stop("load rgl")} 
     xvec <- seq(x_range[1], x_range[2], len=15) 
     yvec <- seq(y_range[1], y_range[2], len=15) 
     fz <- outer(xvec, yvec, FUN=f2) 
     open3d() 
     persp3d(xvec, yvec, fz, col=col) } 
curve_3d(f2) 
snapshot3d("out3dplane.png") 

Rotatable pseudo3d plot of plane

Bây giờ tôi nghĩ về nó hơn nữa, bạn có thể làm một cái gì đó tương tự với persp() hoặc wireframe(). Các "lừa" được sử dụng bên ngoài (..., FUN = vui vẻ). Và khi tôi nghĩ về nó hơn nữa ... khả năng sử dụng nó với outer phụ thuộc vào nó được bao gồm tất cả các hoạt động vectorized. Nếu chúng không được vector hóa, chúng tôi sẽ cần phải viết lại với Vectorize hoặc mapply.

2

Xem curve3d() trong package:emdbook, là trình bao bọc cho wireframe(), persp3d() và hơn thế nữa.

library(emdbook) 
# bivariate normal density with emdbook::curve3d 
curve3d(expr = dmvnorm(x=c(x,y), mu = c(0,0), Sigma = diag(2)), 
    from = c(-3,-3), to = c(3,3), n = 100, sys3d = "wireframe") 
1

Chức năng persp3d() có thể lấy chức năng làm đối số. Xem ?persp3d.function.

Nó cho phép hai loại bề mặt này có thể vẽ: một chức năng của xy như bạn muốn, và một bề mặt tham số, nơi x, yz là tất cả chức năng của hai biến khác.

Ví dụ của bạn, nó đơn giản như

f2 <- function(x, y) x + y 
persp3d(f2) 

nhưng tất nhiên bạn có thể thêm tất cả các loại kiểu cách, giống như có màu sắc phụ thuộc vào z, thay đổi phạm vi của xy vv