R中曲线函数的3D等效函数是什么?

8

R中的curve函数提供了一种简单的方法来绘制函数。例如,这将绘制一条直线。

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

在R语言中是否有相应的函数,可以接受一个含有两个参数(如x和y)的函数以及这两个变量的范围,并生成一个三维图形?

例如,想象一下我有以下函数:

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

有类似以下命令的吗?

curve_3d(f2, x_range=c(-1, 1), y_range=c(-1, 1))
4个回答

7

rgl包中的surface3d函数看起来很合适。很容易创建一个包装器,它将使用seq()创建一个x-y向量集,然后将这些向量传递给outer,并将f2作为FUN参数,然后调用surface3d

还有一个persp3d,作者(Duncan Murdoch和其他人)说它是“更高级”的,它似乎默认添加轴,而surface3d则没有。

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")

可旋转的平面伪3D图

现在我进一步思考,你也可以使用persp()wireframe()来实现类似的效果。 "诀窍"是使用outer(..., FUN=fun)。而且,当我进一步思考时......使用它与outer的能力取决于它由所有矢量化操作组成。如果它们不是矢量化的,我们需要使用Vectorizemapply进行重写。


2

您可以使用 plot3Drgl 包创建交互式图形。

library(plot3Drgl)

f <- function(x,y) x+y
x <- y <- seq(-4,4,len=20)
z <- outer(x, y, f)

persp3Drgl(z=z)

enter image description here


2

请查看emdbook包中的curve3d()函数,它是wireframe()persp3d()等函数的包装器。

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

persp3d()函数可以将函数作为参数传入。请参见?persp3d.function

它允许绘制两种类型的表面:您想要的xy函数,以及参数化表面,其中xyz都是另外两个变量的函数。

对于您的示例,只需简单地使用:

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

当然,你可以添加各种花哨的东西,例如让颜色依赖于z,改变xy的范围等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接