作者:李誉辉
四川大学在读研究生
前言
这篇是plot3D包绘图系列之二,前一篇请戳:R_3D图(一),后面的章节会出3D柱形图,函数绘图,三维散点图等。敬请期待,做教程狠费精力的,别忘了点赞和转发。谢谢。
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)))
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) # 增加图例分箱线
perspbox()
画boxperspbox()
画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颜色为粉红色
mesh()
mesh (x, y, z = NULL)
用于绘制2维或3维的网格数据。
本身并不产生图形,通过with后处理产生网格坐标信息,与向量外积计算结果相同。
但外积只能用于2个向量计算,而mesh
和with
可以用于3个向量计算。
返回1个列表,包含x,y,z三个数组。
参数解释:
x,y,z为向量,任意长度。
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参数一致
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大小
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")
plotdev()
,getplist()
等getplist()
查询上一个绘图对象的参数组成的列表
seplist()
保留更改后的列表参数。
plotdev()
绘制更改参数后的绘图对象。
也可以直接更改观察角度,光照角度等参数。
还可以设定图形对象的显示范围。
selectplist()
筛选列表中的部件,根据自定义函数筛选, 可以筛选部件,也可以筛选图形显示范围。
比较复杂,
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()
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))
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语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法