【问题标题】:3D equivalent of the curve function in R?R中曲线函数的3D等效?
【发布时间】:2025-12-27 02:35:11
【问题描述】:

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

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

R 中是否有一个等效函数,它接受一个具有两个参数(例如,xy)的函数和两个变量的范围并生成 3D 图?

例如,假设我有以下功能

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

有类似下面的命令吗?

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

【问题讨论】:

    标签: r 3d rgl


    【解决方案1】:

    package:rgl 中的surface3d 函数看起来很合适。创建一个包含您的函数的包装器将非常简单,使用seq() 创建一组x-y 向量,然后将这些向量传递给outer,并将您的f2 作为FUN 参数,然后调用surface3d

    还有一个persp3dpersp3d,作者(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")
    

    现在我进一步考虑,你可以用persp()wireframe() 做类似的事情。 “技巧”是使用外部(...,FUN=fun)。而且当我进一步考虑时……将它与outer 一起使用的能力取决于它由所有矢量化操作组成。如果它们没有被矢量化,我们需要用Vectorizemapply 重写。

    【讨论】:

      【解决方案2】:

      参见package: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")
      

      【讨论】:

        【解决方案3】:

        您可以使用plot3Drgl 包进行交互式绘图。

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

        【讨论】:

          【解决方案4】:

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

          它允许绘制两种类型的曲面:xy 的函数,如您所愿,以及参数曲面,其中 xyz 都是另外两个函数变量。

          对于你的例子,它很简单

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

          当然你可以添加各种装饰,比如让颜色依赖于z,改变xy的范围等等。

          【讨论】: