专注系列化、高质量的R语言教程
本篇是专门介绍plot3D
工具包的最后一篇推文,主要介绍三个函数,其余函数读者可根据需要自行学习。本篇目录如下:
mesh函数
surf3D函数
spheresurf3D函数
library(plot3D)
mesh函数
mesh()
函数是个很有用的辅助函数,可以根据两个或三个向量生成矩阵或数组。
mesh(x, y, z = NULL)
x
、y
、z
均为向量结构;当
z = NULL
时,函数生成由两个矩阵组成的列表;每个矩阵的行数等于x
的长度,列数等于y
的长度。
第一个矩阵相当于将x
按列重复;第二个矩阵相当于将y
按行重复。示例如下:
mesh(1:2, 3:5)
## $x
## [,1] [,2] [,3]
## [1,] 1 1 1
## [2,] 2 2 2
##
## $y
## [,1] [,2] [,3]
## [1,] 3 4 5
## [2,] 3 4 5
我们知道,向量外积可以使用操作符%o%
计算(见推文数值运算符和逻辑运算符):
1:2 %o% 3:5
## [,1] [,2] [,3]
## [1,] 3 4 5
## [2,] 6 8 10
将其拆开来看,就是mesh()
函数输出结果的两个矩阵的哈达马积:
M = mesh(1:2, 3:5)
M$x * M$y
## [,1] [,2] [,3]
## [1,] 3 4 5
## [2,] 6 8 10
当
z ≠ NULL
时,函数生成有三个数组组成的列表;每个数组的三个维度分别等于x
、y
、z
的长度。
mesh(1:2, 3:5, 6:7)
## $x
## , , 1
##
## [,1] [,2] [,3]
## [1,] 1 1 1
## [2,] 2 2 2
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 1 1 1
## [2,] 2 2 2
##
##
## $y
## , , 1
##
## [,1] [,2] [,3]
## [1,] 3 4 5
## [2,] 3 4 5
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 3 4 5
## [2,] 3 4 5
##
##
## $z
## , , 1
##
## [,1] [,2] [,3]
## [1,] 6 6 6
## [2,] 6 6 6
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 7 7 7
## [2,] 7 7 7
在下文函数的示例中,还会用到mesh()
函数。
surf3D函数
surf3D()
函数主要用来绘制三维几何图形,完整语法结构如下:
surf3D(x, y, z, ..., colvar = z, phi = 40, theta = 40,
col = NULL, NAcol = "white", breaks = NULL,
border = NA, facets = TRUE, colkey = NULL,
panel.first = NULL, clim = NULL, clab = NULL, bty = "n",
lighting = FALSE, shade = NA, ltheta = -135, lphi = 0,
inttype = 1, add = FALSE, plot = TRUE)
x、y、z:构成三维几何图形曲面的散点坐标。
下图展示了球坐标和直角坐标的关系:

根据这一关系,使用下面代码绘制一个球形:
M = mesh(
x = seq(0, 2*pi, length.out = 100),
y = seq(0, pi, length.out = 100)
)
phi = M$x
theta = M$y
r = 2
x = r*sin(theta)*cos(phi)
y = r*sin(theta)*sin(phi)
z = r*cos(theta)
par(mfrow = c(1,2))
surf3D(x,y,z, colvar = z)
surf3D(x,y,z, facets = F)

对于球形来说,r
是个固定的数值,即球半径。下面代码通过变化r
绘制新的图形:
r0 = seq(0, 2, length.out = 100)
r = matrix(rep(r0, 100), nrow = 100, byrow = T)
x = r*sin(theta)*cos(phi)
y = r*sin(theta)*sin(phi)
z = r*cos(theta)
surf3D(x,y,z)

spheresurf3D函数
spheresurf3D()
函数是绘制球形的快捷函数:
spheresurf3D()

通过设置colvar
参数可给球形上色:
par(mfrow = c(1,2))
spheresurf3D(colvar = Hypsometry$z)
spheresurf3D(colvar = Hypsometry$z,
theta = 200, phi = 30)

更多示例可参见函数的帮助文档。