如何在R中制作给定球面极坐标方程的三维图?

时间:2016-01-20 16:40:51

标签: r plot 3d

假设我们在球坐标系中有一个极坐标方程:
  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 个答案:

答案 0 :(得分:2)

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

下一步是为角度thetaphi定义一个值网格。 plot3D提供了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&#39; s 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 = 20theta = 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