plot3D | 三维数据绘图(2):常见图形——线段、箭头、矩形、长方体、箱线、多边形...


专注系列化高质量的R语言教程

推文索引 | 联系小编 | 付费合集


本篇推文介绍几种常见的图形在plot3D工具包中的绘制函数。目录如下:

  • 线段

  • 箭头

  • 矩形

  • 长方体

  • 箱线

  • 多边形

  • add参数

library(plot3D)

线段

graphcis工具包里绘制线段的函数是segments(),对应到plot3D工具包的函数就是segments3D()segments2D()

参数中,x0y0z0表示线段起点的坐标,x1y1z1表示线段终点的坐标。可以使用向量同时绘制多个线段。

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)
ff61d337efb39490d154f3b2031cd0f0.png
segments2D(x0, y0, x1, y1, col = gg.col(4),
           lwd = 2)
2bee2d4db9b8f22a706f7fb8e9e277b1.png

箭头

graphcis工具包里绘制箭头的函数是arrows(),对应到plot3D工具包的函数就是arrows3D()arrows2D()

参数含义同segments3D()函数。

arrows3D(x0, y0, z0, x1, y1, z1,
         covar = x0, col = gg.col(4),
         lwd = 2)
e3d8aadad98c1b6e0a67d5a841b51fe4.png
arrows2D(x0, y0, x1, y1,
         col = gg.col(4),
         lwd = 2)
3ed715ae75c8d485e63a6913186d9718.png

矩形

graphcis工具包里绘制矩形的函数是rect()。这里的矩形并不是任意形式的矩形,而是四条边都与x、y轴平行或垂直的矩形,因此在绘制时只需要提供其中一个对角线的两个端点的坐标即可确定矩形位置。

对应到plot3D工具包的函数就是rect3D(),它只能绘制与x-y平面、x-z平面和y-z平面的其中一个平面平行的矩形。

参数中,x0y0z0表示对角线起点端点的坐标,x1y1z1表示对角线终点端点的坐标。为了保证矩形平行于x-y平面、x-z平面和y-z平面中的一个,x1y1z1的其中一个必须设置为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,)
5943b5b73955d431c066ca796b9f9034.png

长方体

绘制长方体的函数是box3D()

参数中,x0y0z0表示体对角线起点端点的的坐标,x1y1z1表示体对角线终点端点的的坐标。

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)
2689abe88e132e234fb7c8c9f9226609.png

读者可能会发现,这里绘制的长方体和常见的直观图效果并不一样。这是因为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)
f4f7a7f2ffd97fc575d2a5e2ed41e1f2.png

上面俯视图正体现了透视图“近大远小”的特点。在直观图下,长方体的俯视图应是一个矩形,而在透视图下,上顶面较近、下底面较远,因此俯视图就会出现出两个矩形,两个矩形顶点间的连线表达了由近到远的变化。

箱线

box3D()函数的用法类似,但是绘制的是长方体的边线。

border3D(x0 = -0.8, y0 = -0.8, z0 = -0.8, 
         x1 =  0.8, y1 =  0.8, z1 =  0.8,
         col = "red")
6604196637a28cf80c737fb1b704baf0.png

多边形

polygon3D()函数在三维空间里,依次连接各点形成一个闭合的多边形。xyz使用向量依次表示各点在三个维度下的坐标。

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)
5256231c707cc3ff06066d5b1b4fbd82.png

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)
c8c0949c0681c730f8ce3502378f0d07.png
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值