R_3D图(二)

浏览: 1641

作者:李誉辉  

四川大学在读研究生 


前言

这篇是plot3D包绘图系列之二,前一篇请戳:R_3D图(一),后面的章节会出3D柱形图,函数绘图,三维散点图等。敬请期待,做教程狠费精力的,别忘了点赞和转发。谢谢。

2 辅助函数

2.1 色板xxx.col()

  • jet.col() 产生matlab类型的颜色

  • jet2.col() 与jet.col类似,但是缺少深蓝色色段。

  • gg.col()( 产生ggpot2类型的颜色

  • gg2.col() 产生ggplot2类型的颜色

  • ramp.col() 通过插值产生颜色向量,离散色板连续化

  • alpha.col() 产生不同透明度的颜色向量

plot3D内置色板

library(ggforce)
require(plot3D)
library(scales)

show_col(jet.col(n = 10, alpha = 0.5))
show_col(jet2.col(n = 10, alpha = 0.5))
show_col(gg.col(n = 10, alpha = 0.5))
show_col(gg2.col(n = 10, alpha = 0.5))
show_col(ramp.col(col = c("green", "magenta"), n = 10, alpha = 0.5))
show_col(alpha.col(col = "magenta", alpha = seq(from = 0, to = 1, by = 0.1)))

2.2 colkey()图例

colkey (col = NULL, clim, clab = NULL, clog = FALSE, add = FALSE,   
       cex.clab = NULL, col.clab = NULL, side.clab = NULL,  
       line.clab = NULL, adj.clab = NULL, font.clab = NULL,  
       side = 4, length = 1, width = 1, dist = 0, shift = 0,  
       addlines = FALSE, breaks = NULL, at = NULL, labels = TRUE, tick = TRUE,  
       line = NA, pos = NA, outer = FALSE, font = NA, lty = 1, lwd = 1,  
       lwd.ticks = 1, col.axis = NULL, col.ticks = NULL, col.box = NULL,  
       hadj = NA, padj = NA, cex.axis = par("cex.axis"),  
       mgp = NULL, tck = NULL, tcl = NULL, las = NULL)  

参数解释:

整个图例:

  • side, 表示指定图例位置,c(1 = “bottom”, 2 = “left”, 3 = “top”, 4 = “right”)。

  • add, 表示是否将图例添加到现有图的边缘位置。FALSE则置于新图的中间。处于中间时,很多参数无法起作用。

  • dist, 表示指定图例与边缘的距离,正数表示靠近边缘,负数表示远离边缘。
    合理的范围是[-0.5, 0.05]。 当add = FALSE时失效。

  • shift, 运动方向与dist垂直,当side=2或4时,正数表示向上移动。
    当length = 1时,不能使用,合理的值应该是[-0.2, 0.2]。同样add = FALSE时失效。

图例标题:

  • clab, 表示指定图例标题内容,默认跟主标题在同一水平面上。 可以是多个标题内容,

  • cex.clab, 表示指定图例标题的尺寸大小,默认与轴标题一样大。

  • col.clab, 表示制定图例标题颜色,默认与主标题同一颜色。

  • side.clab, 表示指定图例标题环绕箱体的相对位置,默认与主标题一致,
    c(1 = “bottom”, 2 = “left”, 3 = “top”, 4 = “right”)

  • adj.clab, 表示图例标题相对图例箱体两端的位置,从0(左)到1(右),默认0.5中间。

  • line.clab, 表示指定图例标题与图例箱体之间的距离,默认line.clab = 1.75 。

  • font.clab, 表示指定图例标题字型,1表示常规体,2表示粗体,3表示斜体,4表示粗斜体。中文失效。

图例箱体:

  • col, 表示指定图例颜色色板,默认jet.col()即红黄蓝色板。

  • length, 表示指定图例箱体的相对长度,1表示等于坐标轴长度。

  • width, 表示指定图例箱体的相对宽度。

  • addlines, 表示是否增加分箱线,默认FALSE图例不增加。

  • col.box, 表示指定图例箱体边框颜色。默认为黑色。

图例刻度及刻度标签:

  • clim, 表示图例刻度范围值。无图时默认(0, 1) 表示全部范围。 可以是反区间

  • clog, 表示图例刻度是否对数变换

  • col.axis, 表示图例坐标轴刻度标签颜色。

  • col.ticks, 表示图例刻度线颜色。

  • breaks, 为数字向量,表示图例刻度断点,默认等距增序排列,无序向量会被自动排序。

  • at, labels, tick, line, pos, outer, font, lty, lwd, lwd.ticks,
    hadj, padj, cex.axis, mpg, tck, tcl, las, 表示其它控制图例刻度的参数。

require(plot3D)

colkey(side = 1,  add = FALSE,  # 图例置于底部,不置于绘图对象,
      clab = "z", col.clab = "red", adj.clab = 0, # 图例标题颜色为红色,图例标题位置居左。
      clim = c(0, 1))  # 刻度范围从0到1,

colkey(side = 3, add = FALSE, clab = "z轴", # 图例置于顶部,不置于绘图对象
      col.clab = "blue", adj.clab = 0.5, line.clab = 5, # 标题蓝色,相对两端居中,距离箱体为5个单位。
      cex.clab = 3, clim = c(0.8, 0.2), # 标题文字尺寸为3个单位,刻度范围从0.8到0.2
      clog = TRUE)# 图例刻度对数变换,

colkey(side = 2,  add = FALSE,  # 图例置于左边
      length = 0.5, width =1.5,  # 图例箱体长度减半。图例箱体宽度增大。
      clab = "我是图例",col.clab = "magenta", adj.clab = 0, # 标题颜色洋红,居于箱体一端
      clim = c(0, 1), breaks = c(0, 0.1, 0.3, 0.4, 0.8, 1)) # 修改刻度断点,结果显示图例刻度等距排列


colkey(side = 4,   # 修改图例色板, 默认add=FALSE
      col = gg2.col(), clab = c("I am legend", "单位" ), # 修改箱体颜色色板,多个图例标题
      col.box = "pink", # 箱体边框颜色为紫色
      side.clab = 1, line.clab = 1, font.clab = 3, # 标题环绕箱体居于底部,距离箱体1个单位,字体斜体。
      clim = c(1e-6, 1), clog = TRUE, col.axis = "magenta", col.ticks = "green", # 刻度对数变换
      addlines = TRUE) # 增加图例分箱线

2.3 perspbox()画box

perspbox()画box及对应的labels,
语法:

perspbox (x = seq(0, 1, length.out = nrow(z)),   
         y = seq(0, 1, length.out = ncol(z)), z,  
         bty = c("b", "b2", "f", "g", "bl", "bl2", "u", "n"),  ...,  
         col.axis = "black", col.panel = NULL, lwd.panel = 1,                      
         col.grid = NULL, lwd.grid = 1,  
         phi = 40, theta = 40, col = NULL,  
         colkey = NULL, plot = TRUE)  

参数解释:

  • x, y, 表示x, y坐标向量,需要比box内的对象范围更大。

  • z, 表示z轴坐标,可以是向量或矩阵。
    如果z是矩阵,则必须满足

  • nrow(z) = length(x)ncol(z) = length(x)

  • bty, 表示指定box类型,只有当persp()box = TRUE才有效, bty = c(“b”, “b2”, “f”, “g”, “bl”, “bl2”, “u”, “n”)其中之一。
    只有当bty="u"时,col.axis, col.panel, lwd.panel, col.grid, lwd.grid才不会被忽略。
    bty="f"表示full box, 所有panels都显示并透明, 与persp()默认一样。
    bty="b"表示仅仅背景panels(3个panel)可见, bty="b2"表示仅仅背景panels和grid可见。相当于“b1”和grid = "grey"的组合。
    bty="bl" 表示仅仅黑色背景, 相当于: col.panel = “black”, col.axis = “grey”, lwd.grid = 2和col.grid = “white”。
    bty="bl2"表示仅仅黑色背景和grid线。
    bty="g"表示仅仅灰色背景和白色grid线。
    相当于:col.panel = grey(0.95), col.axis = “grey”, lwd.grid = 2和col.grid = “white”。
    bty="u" 表示手动指定参数col.axis, col.panel, lwd.panel, col.grid, lwd.grid。
    bty="n"表示不显示box, 相当于persp()box=FALSE

  • col.axis, 表示指定坐标轴颜色

  • col.panel, 表示指定坐标轴panel颜色

  • col.grid, 表示指定grid颜色

  • lwd.panel, 表示指定panel border宽度。

  • lwd.grid, 表示grid线宽

  • theta, phi, 表示指定观察方向,与persp()中一样。

  • col, 表示指定colvar变量的颜色, 仅仅用于评估是否应该绘制图例。

  • colkey, 为逻辑值或NULL(默认),或一个与colkey()中参数组成的列表用于绘制图例,

  • plot, 为逻辑值,TRUE(默认)则绘制box, FALSE则返回转换矩阵数据。

  • …, 其它传递给persp()的参数, 如:xlim, ylim, zlim, xlab, ylab, zlab, main, sub, r, d,
    scale, expand, box, axes, nticks, ticktype, 只有scale和expand参数会影响坐标轴的尺寸。

require(plot3D)

par(mfrow = c(2, 2), mar = c(1, 1, 1, 1)) # 多图排版,2*2矩阵排列

# b类型box
perspbox(z = volcano, bty = "b", ticktype = "detailed", d = 2, # d=2>1降低透视度强度
         main  = "bty = 'b'") # 增加标题

# f类型box,与persp()函数默认一样
perspbox(z = volcano, bty = "f", ticktype = "detailed", # ticktype="detailed"表示显示坐标轴刻度及标签
         d = 2, main  = "bty = 'f'") # 增加标题

# b2类型box, 背景panel与灰色grid
perspbox(z = volcano, bty = "b2", ticktype = "detailed",
         d = 2, main  = "bty = 'b2'") # 增加标题

# g类型box, 类似ggplot2()默认风格,灰色背景和白色grid,
perspbox(z = volcano, bty = "g",
         d = 2, main  = "bty = 'g'") # 增加标题

# 自定义box类型, bty = "u"
par(mfrow = c(1, 1))

perspbox(z = diag(2), bty = "u", ticktype = "detailed",
         col.panel = "cyan", col.axis = "magenta",  # panels颜色为cyan,坐标轴颜色为洋红
         lwd.panel = 8, lwd.grid = 2, # 指定panel宽度为8,grid宽度为2
         scale = FALSE, expand = 0.4,
         col.grid = "pink", main = "user-defined") # grid颜色为粉红色

2.4 mesh()

mesh (x, y, z = NULL) 用于绘制2维或3维的网格数据。
本身并不产生图形,通过with后处理产生网格坐标信息,与向量外积计算结果相同。
但外积只能用于2个向量计算,而meshwith可以用于3个向量计算。
返回1个列表,包含x,y,z三个数组。
参数解释:

  • x,y,z为向量,任意长度。

2.4.1 二维网格

library(plot3D)

x <- c(-1 , 0, 1)
y <- 1 : 4 # x,y长度不等

# 2维网格
M <- mesh(x, y)
class(M); # 结果为列表,元素为x,y

# 使用with函数计算,因为是二维数据源,所以返回一个矩阵
V <- with (M, x/2 * sin(y)); class(V)

# 与向量外积计算结果一样
V2 <- outer(x, y, FUN = function(x, y) x/2*sin(y)) # outer内的Fun参数与with内的Fun参数一致

2.4.2 三维网格

library(plot3D)

x <- y <- z <- c(-1, 0, 1)

# 三维网格
M <- mesh(x, y, z)
class(M)  # 返回列表

# with后处理,返回1个数组
V <- with(M, x/2 * sin(y) * sqrt(z + 2))
class(V)

# 使用坐标数据绘制三维散点图
scatter3D(M$x, M$y, M$z, colvar = V, pch = "G", cex = 2, colkey = FALSE)  # pch点型还可以指定字符,cex大小

2.5 tran3D()tran3d()

构建转换空间。使用pmat参数将一个绘图对象转换为转换空间
tran3d()属于grDevices包。
tran3d()可以查看小节: #基础图形中,##三维地形图persp(),###tran3d()上添加几何对象
tran3D()如下:

library(plot3D)
x <- y <- z <- c(-1, 0, 1)
# 构建三维网格
M <- mesh(x, y, z)
pmat <- scatter3D(M$x, M$y, M$z, pch = "+", cex = 3, colkey = FALSE)
# 构建转换空间,
XY <- trans3D(x = c(-1, 1), y = c(-1, 1), z = c(-1, 1), pmat = pmat)  # x, y, z表示坐标范围
# 在转换空间中添加线
lines(XY, lwd = 2, col = "blue")

2.6 plotdev(),getplist()

  • getplist() 查询上一个绘图对象的参数组成的列表

  • seplist() 保留更改后的列表参数。

  • plotdev() 绘制更改参数后的绘图对象。
    也可以直接更改观察角度,光照角度等参数。
    还可以设定图形对象的显示范围。

  • selectplist() 筛选列表中的部件,根据自定义函数筛选, 可以筛选部件,也可以筛选图形显示范围。
    比较复杂,

2.6.1 getplist()setplist()

library(plot3D)

# 随便绘个图
coord_2 <- data.frame(x = c(1, 4, 6, 2), y = c(1, 3, 7, 4), z = c(1, 1, 3, 3))
polygon3D(coord_2$x, coord_2$y, coord_2$z, col = "cyan", alpha = 0.5, border = "magenta",
   lwd = 4)

# getplist函数检索绘图绘图参数列表
plist <- getplist()

names(plist)  # 打印列表元素名称
plist$poly  # 列表索引

# 手动更改列表中参数,由于R的深copy对象,plist并没有更改,而是更改复制的对象
plist$poly$col <- "magenta"  # 更改网格面颜色
plist$poly$border <- "cyan"  # 更改网格边框颜色

# setplist更新列表参数,这是才保留更改plist列表中的参数
setplist(plist)

# 绘图参数更改的绘图对象
plotdev()

2.6.2 selectplist()

library(plot3D)

# 绘制很多个图层的图
set.seed(421)
polygon3D(runif(10), runif(10), runif(10), col = "red", alpha = 0.2, plot = FALSE,
   ticktype = "detailed", xlim = c(0, 1), ylim = c(0, 1), zlim = c(0, 1))

set.seed(422)
polygon3D(runif(10) * 0.5, runif(10), runif(10), col = "yellow", alpha = 0.2,
   plot = FALSE, add = TRUE)

set.seed(423)
polygon3D(runif(10) * 0.5 + 0.5, runif(10), runif(10), col = "green", alpha = 0.2,
   plot = FALSE, add = TRUE)

set.seed(424)
points3D(runif(10), runif(10), runif(10), col = "blue", add = TRUE, plot = FALSE)

set.seed(425)
segments3D(x0 = runif(10), y0 = runif(10), z0 = runif(10), x1 = runif(10), y1 = runif(10),
   z1 = runif(10), colvar = 1:10, add = TRUE, lwd = 3)

# 索引绘图参数列表
plist <- getplist()
names(plist)
# 自定义筛选部件和显示范围的函数
SS <- function(x, y, z) {
   sel <- rep(TRUE, length.out = length(x))
   sel[x < 0.5] <- FALSE  # 删除x<0.5的数据
   return(sel)
}

# 打印更改绘图对象,调用更改参数的函数。
plot(x = selectplist(plist, SS), xlim = c(0, 1), ylim = c(0, 1), zlim = c(0,
   1))

2.6.3 plotdev()

plotdev(...)对已经存在的绘图对象进行缩放,切换视角,更改显示范围,更改透明度和阴影等处理。
参数解释:
* theta, phi, xlim, ylim, zlim, d, r, scale, expand,与persp()中一致。

require(plot3D)

par(mfrow = c(2, 2), mar = c(2, 2, 2, 2))  # 多图排版,2*2矩阵排列

# 创建数据
x <- seq(1, nrow(volcano), by = 2)
y <- seq(1, ncol(volcano), by = 2)
V <- volcano[x, y]

# 创建绘图对象
persp3D(z = V, col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1))

# 旋转
plotdev(theta = 0)

# 对曲面打光,设定打光方向,设定透明度
plotdev(lighting = TRUE, lphi = 90, alpha = 0.6)

# 局部放大: 就是设定局部的显示范围,更改视角
plotdev(xlim = c(0.2, 0.6), ylim = c(0.2, 0.6), phi = 60)

 

#循环绘制多个视角

require(plot3D)

par(mar = c(2, 2, 2, 2))

# equation of a sphere
M <- mesh(seq(0, 2 * pi, length.out = 100), -seq(0, pi, length.out = 100))
u <- M$x
v <- M$y

x <- cos(u) * sin(v)
y <- sin(u) * sin(v)
z <- cos(v)

# 画第一个图层
surf3D(x, y, z, colvar = z, theta = 45, phi = 20, bty = "b", col = ramp.col(col = c("cyan",
   "magenta"), n = 102, alpha = 1), xlim = c(-1.5, 1.5), ylim = c(-1, 2), zlim = c(-1.5,
   1.5), plot = FALSE)

# 增加1个图层,相当于第一个图层中的图形对象向y轴正向偏移1个单位
surf3D(x, y + 1, z, colvar = z, add = TRUE, col = ramp.col(col = c("cyan", "magenta"),
   n = 102, alpha = 1), facets = FALSE, plot = FALSE)

# 定义一个平面:z=0
Nx <- 100
Ny <- 100

x <- seq(-1.5, 1.5, length.out = Nx)
y <- seq(-1, 2, length.out = Ny)

# 在z=0处绘制一个平面,给现有的绘图对象增加图层
image3D(x = x, y = y, z = 0, add = TRUE, colvar = NULL, col = "green", facets = TRUE,
   plot = FALSE)

# 定义一个平面:y=0
x <- seq(-1, 1, length.out = 50)
z <- seq(-1, 1, length.out = 50)

# 在y=0处绘制一个平面,给现有的绘图对象增加图层
image3D(x = x, y = 0, z = z, colvar = NULL, add = TRUE, col = NA, border = "green",
   facets = TRUE, plot = TRUE)  # plot = TRUE,最后一个图层绘制后才一起显示出来    


# 循环绘制不同视角的图形,共36个图形 for (angle in seq(0, 360, by = 10))
# plotdev(theta = angle)

····

往期精彩:

R_插值_拟合_回归_样条

R_circlize包_和弦图(一)

R_circlize包_和弦图(二)

R_ggplot2基础(一)

R_ggplot2基础(二)

R_ggplot2基础(三)

R_ggplot2基础(四

····

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战  
回复 Python       1小时破冰入门

回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

推荐 1
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册