代码之家  ›  专栏  ›  技术社区  ›  BhishanPoudel

如何在R中绘制给定球面极性方程的三维图?

  •  -1
  • BhishanPoudel  · 技术社区  · 10 年前

    假设我们有一个球坐标下的极坐标方程:
    f(θ)=1+cos[2θ]

    如果我们使用Mathematica制作3D绘图,我们可以这样做:

    SphericalPlot3d[1+cos[2theta],{theta,0,pi},{phi,0,2pi}]
    

    现在问题仍然存在:“我们如何在R中做同样的事情?”

    Mathematica的链接是:
    https://reference.wolfram.com/language/ref/SphericalPlot3D.html

    1 回复  |  直到 10 年前
        1
  •  3
  •   Stibu    10 年前

    包裹 plot3D 允许您在R中创建3D绘图。它将x、y和z坐标作为输入,因此需要额外的步骤将球面坐标转换为笛卡尔坐标。为此,我定义了一个函数,如下所示:

    spher2cart <- function(r, theta, phi) {
    
       x <- r * sin(theta) * cos(phi)
       y <- r * sin(theta) * sin(phi)
       z <- r * cos(theta)
    
       return(list(x = x, y = y, z = z))
    }
    

    下一步是定义角度值的网格 theta phi . 三维绘图 提供该功能 mesh() 很容易做到这一点。

    library(plot3D)
    theta <- seq(0, pi, length = 50)
    phi <- seq(0, 2*pi, length = 50)
    M <- mesh(theta, phi)
    names(M) <- c("theta", "phi")
    

    然后 r (对应于Mathematica的第一个参数 SphericalPlot3d )可以计算:

    r <- 1 + cos(2 * M$theta)
    

    正如我已经提到的,我们需要用笛卡尔坐标表示:

    cart <- spher2cart(r, M$theta, M$phi)
    

    最后,创建了以下情节:

    par(mar = c(0, 0, 0, 0))
    surf3D(cart$x, cart$y, cart$z, border = "black",
           colkey = FALSE, bty = "f",
           phi = 20, theta = 30)
    

    enter image description here

    有许多选项可以 surf3D() 你可以用 ?surf3D 。我使用的是:

    • border = "black" :这将打开黑线网格。
    • colkey = FALSE :关闭颜色图例
    • bty = "f" :绘制完整的轴框。如果你不想要这个盒子,就省略这个。
    • phi = 20 , theta = 30 :更改查看绘图的角度

    还有一个 vignette for plot3d 有许多例子。

    编辑: 作为第二个例子,我展示了相同的图,但有一些变化:

    • 表面采用灰色 col = "grey" (也可以使用其他颜色)。
    • 使用关闭轴标签 xlab = "", ylab = "", zlab = "" .

    这将导致以下代码和绘图:

    surf3D(cart$x, cart$y, cart$z, border = "black",
           colkey = FALSE, bty = "f",
           phi = 20, theta = 30,
           col = "grey",
           xlab = "", ylab = "", zlab = "")
    

    enter image description here