本篇推文介绍几种常见的图形在plot3D
工具包中的绘制函数。目录如下:
- 线段
- 箭头
- 矩形
- 长方体
- 箱线
- 多边形
- add参数
library(plot3D)
线段
graphcis
工具包里绘制线段的函数是segments()
,对应到plot3D
工具包的函数就是segments3D()
和segments2D()
。
参数中,x0
、y0
、z0
表示线段起点的坐标,x1
、y1
、z1
表示线段终点的坐标。可以使用向量同时绘制多个线段。
x0 <- c(-0.8, 0.8, 0.8, -0.8)
x1 <- c( 0.8, 0.8, -0.8, -0.8)
y0 <- c(-0.8, -0.8, 0.8, 0.8)
y1 <- c(-0.8, 0.8, 0.8, -0.8)
z0 <- c(0, 0, 0, 0)
z1 <- z0
segments3D(x0, y0, z0, x1, y1, z1,
covar = x0, col = gg.col(4),
lwd = 2)
segments2D(x0, y0, x1, y1, col = gg.col(4),
lwd = 2)
箭头
graphcis
工具包里绘制箭头的函数是arrows()
,对应到plot3D
工具包的函数就是arrows3D()
和arrows2D()
。
参数含义同segments3D()
函数。
arrows3D(x0, y0, z0, x1, y1, z1,
covar = x0, col = gg.col(4),
lwd = 2)
arrows2D(x0, y0, x1, y1,
col = gg.col(4),
lwd = 2)
矩形
graphcis
工具包里绘制矩形的函数是rect()
。这里的矩形并不是任意形式的矩形,而是四条边都与x、y轴平行或垂直的矩形,因此在绘制时只需要提供其中一个对角线的两个端点的坐标即可确定矩形位置。
对应到plot3D
工具包的函数就是rect3D()
,它只能绘制与x-y平面、x-z平面和y-z平面的其中一个平面平行的矩形。
参数中,x0
、y0
、z0
表示对角线起点端点的坐标,x1
、y1
、z1
表示对角线终点端点的坐标。为了保证矩形平行于x-y平面、x-z平面和y-z平面中的一个,x1
、y1
、z1
的其中一个必须设置为NULL
。例如,若z1 = NULL
,则矩形平行于x-y平面。可以使用向量同时绘制多个矩形。
par(mfrow = c(1,2))
rect3D(0,0,1,1,1, col = "red",
border = "blue", lwd = 2)
rect3D(0,1,1,1, z1 = 0, col = "blue",
border = "red", lwd = 2,)
长方体
绘制长方体的函数是box3D()
。
参数中,x0
、y0
、z0
表示体对角线起点端点的的坐标,x1
、y1
、z1
表示体对角线终点端点的的坐标。
box3D(x0 = -0.8, y0 = -0.8, z0 = -0.8,
x1 = 0.8, y1 = 0.8, z1 = 0.8,
col = "red", border = "black", lwd = 2)
读者可能会发现,这里绘制的长方体和常见的直观图效果并不一样。这是因为
plot3D
工具包绘制的是透视图,它使用的是点光源,遵循的原则是“近大远小”,平行关系会被改变;而绘制直观图使用的是平行光源,其不会改变平行关系。
设置phi = 90
表示从正上方俯视长方体,效果如下:
box3D(x0 = -0.8, y0 = -0.8, z0 = -0.8,
x1 = 0.8, y1 = 0.8, z1 = 0.8,
col = "red", border = "black", lwd = 2,
phi = 90, alpha = 0.5)
上面俯视图正体现了透视图“近大远小”的特点。在直观图下,长方体的俯视图应是一个矩形,而在透视图下,上顶面较近、下底面较远,因此俯视图就会出现出两个矩形,两个矩形顶点间的连线表达了由近到远的变化。
箱线
与box3D()
函数的用法类似,但是绘制的是长方体的边线。
border3D(x0 = -0.8, y0 = -0.8, z0 = -0.8,
x1 = 0.8, y1 = 0.8, z1 = 0.8,
col = "red")
多边形
polygon3D()
函数在三维空间里,依次连接各点形成一个闭合的多边形。x
、y
、z
使用向量依次表示各点在三个维度下的坐标。
polygon3D(x = c(1, 0, 0, 1),
y = c(0, 0, 1, 1),
z = c(0, 1, 1, 0),
col = "red", border = "black",
lwd = 2, alpha = 0.4)
add参数
因为每个图形绘制函数都有add
参数,因此可以很方便地在同一坐标系下进行图形叠加。
以下示例来自函数帮助文档:
xx <- yy <- seq(-0.8, 0.8, by = 0.2)
zz <- seq(-0.8, 0.8, by = 0.8)
M <- mesh(xx, yy, zz)
x0 <- M$x; y0 <- M$y; z0 <- M$z
x1 <- x0 + 0.1
Col <- c("red", "blue", "green")
arrows3D(x0, y0, z0, x1 = x1, colvar = z0, lwd = 2,
d = 2, clab = "z-value", col = Col, length = 0.1,
xlim = c(-0.8, 0.8), ylim = c(-0.8, 0.8),
main = "arrows3D, points3D, segments3D, border3D")
# add starting point of arrows
points3D(x0, y0, z0, add = TRUE, colvar = z0,
colkey = FALSE, pch = ".", cex = 3, col = Col)
# use segments to add section
x0 <- c(-0.8, 0.8, 0.8, -0.8)
x1 <- c( 0.8, 0.8, -0.8, -0.8)
y0 <- c(-0.8, -0.8, 0.8, -0.8)
y1 <- c(-0.8, 0.8, 0.8, 0.8)
z0 <- c(0., 0., 0., 0.)
segments3D(x0, y0, z0, x1, y1, z1 = z0,
add = TRUE, col = "black", lwd = 2)
# add a box
border3D(-0.8, -0.8, -0.8, 0.8, 0.8, 0.8,
col = "orange", add = TRUE, lwd = 3)