R_3D图(二)

栏目: R语言 · 发布时间: 5年前

作者: 李誉辉

四川大学在读研究生 

前言

这篇是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)))

R_3D图(二)

R_3D图(二) R_3D图(二) R_3D图(二) R_3D图(二) R_3D图(二)

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, 表示其它控制图例刻度的参数。

R_3D图(二)

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) # 增加图例分箱线

R_3D图(二)

R_3D图(二)

R_3D图(二)

R_3D图(二)

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参数会影响坐标轴的尺寸。

R_3D图(二)

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颜色为粉红色

R_3D图(二)

R_3D图(二)

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大小

R_3D图(二)

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

R_3D图(二)

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

R_3D图(二)

R_3D图(二)

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

R_3D图(二)

R_3D图(二)

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)

R_3D图(二)

#循环绘制多个视角

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_3D图(二)

····

往期精彩:

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

R_circlize包_和弦图(一)

R_circlize包_和弦图(二)

R_ggplot2基础(一)

R_ggplot2基础(二)

R_ggplot2基础(三)

R_ggplot2基础(四

····

R_3D图(二)

R_3D图(二)

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

回复 爬虫 爬虫三大案例实战  

Python

1小时破冰入门

回复 数据挖掘  R语言入门及数据挖掘

回复  人工智能 三个月入门人工智能

回复  数据分析师 数据分析师成长之路 

回复 机器学习 机器学习的商业应用

回复  数据科学 数据科学实战

常用算法

常用数据挖掘算法

R_3D图(二)

本文由R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。

转载、引用前需联系作者,并署名作者且注明文章出处。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Book of CSS3

The Book of CSS3

Peter Gasston / No Starch Press / 2011-5-13 / USD 34.95

CSS3 is the technology behind most of the eye-catching visuals on the Web today, but the official documentation can be dry and hard to follow. Luckily, The Book of CSS3 distills the heady technical la......一起来看看 《The Book of CSS3》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器