R_3D图(二)

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

作者: 李誉辉

四川大学在读研究生 

前言

这篇是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 中国大陆许可协议 进行许可。

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

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


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

查看所有标签

猜你喜欢:

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

计算的本质

计算的本质

[英] Tom Stuart / 张伟 / 人民邮电出版社 / 2014-11 / 69.00元

《计算的本质:深入剖析程序和计算机》借助Ruby全面介绍计算理论和编程语言的设计。作者注重实用性,不仅尽量抛开复杂难懂的数学符号,而且特别选用简单快捷的编程语言Ruby,在读者熟知的背景知识下,以明晰的可工作代码阐明形式语义、自动机理论,以及通过lambda演算进行函数式编程等计算机科学知识,并为让其自行探索做足准备。 本书适合计算机科学系学生,以及熟知现代编程语言,想要系统地学习计算机科学......一起来看看 《计算的本质》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具