2012-08-09 22 views
8

La función curve en R proporciona una forma sencilla de trazar una función. Por ejemplo, esto va a trazar una línea rectaequivalente 3D de la función de curva en R?

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

¿Hay una función equivalente en R que tiene una función con dos argumentos (por ejemplo, x y y) y oscila para ambas variables y produce un gráfico 3D?

Por ejemplo, imaginemos que tenían la siguiente función

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

¿Hay un comando similar al siguiente?

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

Respuesta

7

La función surface3d en el paquete: RGL se ve como un buen partido. Sería muy simple crear un contenedor que tomaría su función, crear un conjunto x-y de vectores con seq() y luego pasar esos vectores a outer con su f2 como el argumento FUN, y luego llamar al surface3d.

También hay un persp3d que los autores (Duncan Murdoch y quizás otros) dicen que es de "nivel superior" y parece agregar los ejes por defecto que surface3d no lo hace.

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

Ahora que lo pienso más, se podría haber hecho algo similar con persp() o wireframe(). El "truco" es usar exterior (..., FUN = diversión). Y a medida que lo pienso aún más ... la posibilidad de usarlo con outer depende de que esté compuesto de todas las operaciones vectorizadas. Si no se vectorizaran, necesitaríamos reescribir con Vectorize o mapply.

2

Consulte curve3d() en package:emdbook, que es un contenedor para wireframe(), persp3d() y más.

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

La función persp3d() puede tener una función como argumento. Ver ?persp3d.function.

Permite dos tipos de revestimiento se van a representar: una función de x y y como desee, y una superficie paramétrica, donde x, y y z son todas las funciones de otras dos variables.

Para su ejemplo, es tan simple como

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

pero por supuesto se puede añadir todo tipo de lujos, como tener el color depende de z, cambiando el rango de x y y, etc.

Cuestiones relacionadas