【问题标题】:Making 3D plot in R在 R 中制作 3D 绘图
【发布时间】:2017-01-15 09:36:36
【问题描述】:

我有两个长度相同的向量 x 和 y;

x <- c(12,14,14,15,16,18)
y <- c(25,36,32,30,36,42)

和函数f

f <- function(a,b) {
sum((y - a - b*x)^2)
}

如果 a 和 b 是两个向量使得:

a <- seq(from=-5,to=5, by=.1)
b <- seq(from=-2.5, to=7.5, by=.1)

我需要为每对可能的ab 评估f,以便为a, b, and z=f(a,b) 制作3D 绘图。

我找到了outer 函数,但这不起作用。您能否建议我替代方案,以便我达到预期的效果?

谢谢

【问题讨论】:

    标签: r plot 3d


    【解决方案1】:

    在两个分开的部分中,您可以使用plot3D 包:

    library(plot3D)
    

    (1) 为每个 a, b 计算 z = f(a, b)

    ### Compute z = f(a, b)
    a <- seq(from=-5,to=5, by=.1)
    b <- seq(from=-2.5, to=7.5, by=.1)
    
    X <- c(12,14,14,15,16,18)
    Y <- c(25,36,32,30,36,42)
    
    f <- function(a,b) {
      sum((Y - a - b*X)^2)
    }
    
    m <- expand.grid(a, b)
    z <- mapply(f, m$Var1, m$Var2)
    

    (2) 声明一个网格并在其上绘制结果:

    ### Plot3D
    M <- mesh(a, b)
    x.plot <- M$x
    y.plot <- M$y
    
    z.plot <- matrix(z, nrow=nrow(x.plot))
    
    persp3D(x.plot, y.plot, z.plot)
    

    这会产生:

    结果必须仔细检查

    【讨论】:

      【解决方案2】:
      xy = expand.grid(a, b)
      #     z = f(xy[,1], xy[,2])
      mapply(f, xy$Var1, xy$Var2) # see comment below
      

      第一个生成ab 的笛卡尔积:

      a = 1:3
      b = 4:5
      expand.grid(a, b)
      # prints (I'm not sure about the row order)
      # 1 4
      # 1 5
      # 2 4
      # 2 5
      # 3 4
      # 3 5
      

      【讨论】:

      • 这不起作用。您需要将函数应用到xy,即mapply(f, xy$Var1, xy$Var2)
      【解决方案3】:

      这是一个使用emdbook 包中的curve3d 的非常简单的解决方案,

      curve3d(f(x,y), from=c(-5,-2.5), to=c(5,7.5), sys3d="persp", theta=90, phi=45)
      

      给予

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-03
        • 1970-01-01
        • 2015-07-12
        • 2022-07-12
        • 2021-07-18
        • 1970-01-01
        • 1970-01-01
        • 2020-02-04
        相关资源
        最近更新 更多