作者: 李誉辉
四川大学在读研究生
前言
这篇是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个向量计算,而 mesh 和 with 可以用于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)
····
往期精彩:
····
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
Python
1小时破冰入门
回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
常用算法
常用数据挖掘算法
本文由R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
PHP典型模块与项目实战大全
杨宇 / 清华大学出版社 / 2012-1 / 79.00元
《PHP典型模块与项目实战大全》以实战开发为原则,以PHP典型模块和项目开发为主线,通过12个高质量的PHP典型模块和6个PHP大型应用,向读者揭示了Web开发的整体结构,并详尽地介绍PHP开发与建站的技术要点。《PHP典型模块与项目实战大全》附带1张DVD,内容是作者为《PHP典型模块与项目实战大全》录制的全程多媒体语音教学视频及《PHP典型模块与项目实战大全》所涉及的源代码。《PHP典型模块与......一起来看看 《PHP典型模块与项目实战大全》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
随机密码生成器
多种字符组合密码