作者:李誉辉
四川大学在读研究生
前言
这篇是plot3D包绘图系列之三,前一篇请戳:R_3D图(二),这一章节主要聚焦三维图的制作。做教程狠费精力的,别忘了点赞和转发。谢谢。
persp3D() 是persp()函数的扩展
ribbon3D() 与persp3D()有些类似,但不是多边形网格,而是带状的网格的曲面。
hist3D()产生三维的直方图。
3.1
语法
persp3D (x = seq(0, 1, length.out = nrow(z)),
y = seq(0, 1, length.out = ncol(z)), z, ...,
colvar = z, phi = 40, theta = 40,
col = NULL, NAcol = "white", breaks = NULL,
border = NA, facets = TRUE, colkey = NULL, resfac = 1,
image = FALSE, contour = FALSE, panel.first = NULL,
clim = NULL, clab = NULL, bty = "b",
lighting = FALSE, shade = NA, ltheta = -135, lphi = 0,
inttype = 1, curtain = FALSE, add = FALSE, plot = TRUE)
ribbon3D (x = seq(0, 1, length.out = nrow(z)),
y = seq(0, 1, length.out = ncol(z)), z, ...,
colvar = z, phi = 40, theta = 40,
col = NULL, NAcol = "white", breaks = NULL,
border = NA, facets = TRUE, colkey = NULL, resfac = 1,
image = FALSE, contour = FALSE, panel.first = NULL,
clim = NULL, clab = NULL, bty = "b",
lighting = FALSE, shade = NA, ltheta = -135, lphi = 0,
space = 0.4, along = "x",
curtain = FALSE, add = FALSE, plot = TRUE)
hist3D (x = seq(0, 1, length.out = nrow(z)),
y = seq(0, 1, length.out = ncol(z)), z, ...,
colvar = z, phi = 40, theta = 40,
col = NULL, NAcol = "white", breaks = NULL,
border = NA, facets = TRUE, colkey = NULL,
image = FALSE, contour = FALSE,
panel.first = NULL, clim = NULL, clab = NULL, bty = "b",
lighting = FALSE, shade = NA, ltheta = -135, lphi = 0,
space = 0, opaque.top = FALSE, zmin = NULL,
add = FALSE, plot = TRUE)
参数解释:
z, 为二维矩阵数据,用于绘制3D透视图。
x, y ,可以是2个向量,也可以是1个矩阵,
如果是向量,则x的长度必须等于z的行数,y的长度必须等于z的列数。
如果是矩阵(只用于persp3D), xy的维度应该与矩阵z相同。
colvar,指定着色的变量,如果给出,则必须与矩阵z维度相同。
如果是NULL,NA,或FALSE将根据colvar切换颜色,
仅当boder参数被指定颜色,shade参数>0,或lighting = TRUE才会产生好的效果。
col, 表示指定颜色色板,用于colvar颜色,
如果col = NULL, 且colvar指定了,则默认“红-黄-蓝”色板。
如果col = NULL, 且colvar指定,则col默认为grey灰度板。
为了与透视图相符,设定colvar = NULL, 使col为一个矩阵,其维度为nrow(z)-1行,ncol(z)-1列。
NAcol, 表示指定colvar
中缺失值的颜色,默认为白色。
breaks, 为数字向量,表示colvar
断点,默认增序排列,无序向量会被自动排序。
colkey, 为逻辑值或NULL(默认)或列表。表示指定图例参数。
add, 为逻辑值,表示是否将该绘图对象添加到现有的绘图对象中,默认FALSE新建图层,TRUE则添加图层。
plot, 为逻辑值, 表示是否绘图,默认TRUE则绘图,FALSE则返回视角转换矩阵。
clab, 表示指定图例标题内容。colkey=TRUE生效。
clim, 表示指定图例显示范围,当colvar指定时生效,clim范围超出colvar则超出部分显示NA。
resfac, 表示指定x和y的分辨率因子,长度为1或2的数字向量指定,
数字大于1,则增加分辨率,通过插值z增加。
若向量长度为1,则在x和y对应的z插值数量相同。
theta, phi, 表示指定观察透视图的方向,与persp()
中一致。
border, 表示指定曲面网格边线的颜色,默认NA不显示曲面网格边线。
facets, 为逻辑值或NA,表示是否指定曲面网格的颜色,TRUE则用col参数指定曲面网格的颜色,
FALSE则为网格为颜色为白色且网格边线为col指定的颜色(前提是border=NA)。
image, 为逻辑值,表示是否在绘图立方体插入另一个图,
如果TRUE,则会底部绘制图像,还允许传递image2D()
函数的参数的列表,
此列表的一个参数side
表示将image2D()
图置于何处位置。side = z-value
, 表示将该图置于z轴value值位置处。side = "zmin"
, side = "zmax"
分别将该图置于底部和顶部,默认置于底部。
contour, 为逻辑值,表示是否在绘图立方体中插入等高线, 如果TRUE, 则默认插入等高线图在底部,也可以通过contour()
函数传递参数。
同样存在位置参数side
, side = "zmin"
, side = "zmax"
分别将该图置于底部和顶部,默认置于底部。
panel.first, 表示指定一种变换函数,常常用于绘制背景网格和三维散点图的平滑处理。 该函数的其中一个参数应该是pmat
矩阵变换。
along, 表示指定绘制ribbons图的方向,c(“x”, “y”, “xy”)其中之一,表示ribbons平行x轴,y轴或xy平面。
curtain, 为逻辑值,TRUE表示ribbon或persp将紧挨着panels。
space, 为数值,表示指定bar/ribbons之间的空白间隙量,
对应hist3D()
, 则介于[0, 0.9]之间。对于ribbon3D()
, 则介于[0.1, 0.9]之间。
也可以是2个长度的向量,分别表示x,y方向的空白间隙量。
bty, 表示指定box类型, 默认仅仅画背景panels, 只有当persp()
中的box=TRUE
时才有效。
其它与perspbox()
函数中一致。bty = c(“b”, “b2”, “f”, “g”, “bl”, “bl2”, “u”, “n”)其中之一。
lighting, 逻辑值或列表指定,表示对曲面网格打光,
FALSE则不打光,TRUE或list指定都会打光,则网格颜色可能变明亮,
list必须用下面的颜色空间指定:
ambient环境光, diffuse漫反射, specular镜面反射, exponent颜色数字, sr阳光反射指数, alpha透明度,
shade, 表示指定阴影指数,与persp()
中一样。
ltheta, lphi, 表示指定打光方向,与persp()
中一样。
inttype, 表示指定多边形网格的插值类型,每个网格的显示由4个角点的坐标和1个颜色决定,共3种插值类型:inttype = 1
(默认)与persp()
曲面一致,z值表示每个网格4个角点的z轴坐标。
如果指定了colvar参数,则将其colvar值重新计算到每个网格的中间,所以colvar维度必须是(nx-1)(ny-1),
且平均值取自源数据(nx和ny分别是x和y点的数量), 这将使颜色分布和阴影过渡更加平滑。inttype = 1
时,colvar中的NA值将在均值计算期间被使用,这将使NA对应的网格区域变大。inttype = 3
为另一种设置,除了NA值的处理不一样,
其它跟inttype = 1
一致,NA不会带入平均值计算过程中,这样会使NA对应的网格区域变小。inttype = 2
设置表示另一种插值方法,当colvar参数被指定的时候,这种设置使用得很频繁。
这种插值方法中,颜色过渡不会平滑处理。它假定z的值和colvar的值都定义在网格的中心的位置,
为了对网格作色,x,y,z对应的panels将扩大。grid数量增大到(nx+1)*(ny+1)。
当colvar被指定时,这将使曲面上的z数据比源数据过渡更加平滑。
这种插值更加适用于颜色变量colvar存在NA值的情况,因为取平均值过程会增加NA对应的网格区域。
opaque.top, 为逻辑值,表示3D直方图中(设置alpha透明),bars顶面是否透明,TRUE则不透明,
默认FALSE表示透明。
zmin, 表示3D直方图中,设置bars的底面位置,默认NULL表示底面将处在zmin位置上。
…, 其它绘图参数,与persp()
函数中参数一致。包括:xlim, ylim, zlim, xlab, ylab, zlab,
main, sub, r, d, scale, expand, box, axes, nticks, ticktype。
还有perspbox()
中一些参数:col.axis, col.panel,
lwd.panel, col.grid, lwd,grid。
还有公共参数: alpha设定绘图对象的透明度(从0到1),
lty, lwd分别设置网格边线的线型和线宽(仅当border 不是NA)
注意:xlim, ylim, zlim仅仅表示设定坐标轴的显示范围,
超出xlim,ylim, zlim范围的图形对象也会被绘制出来。
如果要设定绘制图形对象的范围,使用plotdev()
函数。
3.2
persp3D()
比较persp3D
与persp
函数的参数:
persp3D (x = seq(0, 1, length.out = nrow(z)),
y = seq(0, 1, length.out = ncol(z)), z, ...,
colvar = z, phi = 40, theta = 40,
col = NULL, NAcol = "white", breaks = NULL,
border = NA, facets = TRUE, colkey = NULL, resfac = 1,
image = FALSE, contour = FALSE, panel.first = NULL,
clim = NULL, clab = NULL, bty = "b",
lighting = FALSE, shade = NA, ltheta = -135, lphi = 0,
inttype = 1, curtain = FALSE, add = FALSE, plot = TRUE)
persp(x = seq(0, 1, length.out = nrow(z)),
y = seq(0, 1, length.out = ncol(z)),
z, xlim = range(x), ylim = range(y),
zlim = range(z, na.rm = TRUE),
xlab = NULL, ylab = NULL, zlab = NULL,
main = NULL, sub = NULL,
theta = 0, phi = 15, r = sqrt(3), d = 1,
scale = TRUE, expand = 1,
col = "white", border = NULL, ltheta = -135, lphi = 0,
shade = NA, box = TRUE, axes = TRUE, nticks = 5,
ticktype = "simple", ...)
参数比较结果:
persp3D
中的xlim, ylim, zlim, 不一样,仅仅用于指定坐标轴的显示范围,
而persp
中需要覆盖住图形的范围。
persp3D
中增加了颜色标度断点参数breaks
, 以进行着色。
persp3D
中增加了参数facets
参数,表示是否显示网格面,可以不显示网格面,只显示网格线。
persp3D
中增加了颜色参数和图例参数: colvar
,NAcol
, colkey
。
persp3D
中增加了lighting
参数(是否打光,打光类型),而persp
中只有shade
参数。
persp3D
中增加了image
和contour
参数,可以插入一个平面图。
persp3D
中增加了resfac
参数,表示指定各个方向的分辨率因子。
persp3D
中增加了inttype
参数,表示可以设置网格插值类型。
persp3D
中增加了curtain
参数, 表示是否紧挨着panels。
persp3D
中增加了图例相关的参数: clab
图例标题内容, clim
图例显示范围,能自动添加图例。
persp3D(z = volcano, contour = list(side = "z", dDepth = 0.))
设定等高线深度。
library(plot3D)
# 设定主标题,图例标题, 设定标度断点以着色, 默认scale = TRUE表示3个坐标轴独立缩放
persp3D(z = volcano, main = "volcano", clab = c("height", "m"),
breaks = seq(80,200, by = 10)) # 设置颜色标度断点
# expand参数z轴方向缩放,expand<1缩小,使用列表传递图例参数
persp3D(z = volcano, x = 1: nrow(volcano), y = 1:ncol(volcano), # x, y比默认的数值大
expand = 0.3, main = "volcano", facets = FALSE, scale = FALSE, # scale = FALSE表示x,y比例不变
clab = "height, m", colkey = list(side = 1, length = 0.5)) # 图例参数:side=1底部,图例箱体缩短
with函数参考用法1
(http://trefoil.github.io/2013/10/15/rwithby.html)
with函数参考用法2
(https://zhuanlan.zhihu.com/p/25847796)
library(plot3D)
x <- seq(-pi, pi, by = 0.2)
y <- seq(-pi, pi, by = 0.3)
grid <- mesh(x, y) # mesh函数创建一个2维或3维的grid绘图对象
z <- with(grid, cos(x) * sin(y)) # 返回1个矩阵对象,值为cos(x) * sin(y)
# 默认绘图
persp3D(z = z, x = x, y = y)
# facets=FALSE,不显示网格面,只显示网格线,curtain =
# TRUE表示图形外轮廓与box贴紧。
persp3D(z = z, x = x, y = y, facets = FALSE, curtain = TRUE)
3.2.3 contour和image参数(插入平面图)
library(plot3D)
x <- seq(1, nrow(volcano), by = 3)
y <- seq(1, ncol(volcano), by = 3)
Volcano <- volcano[x, y] # 抽取volcano中x行,y列对应的元素赋予Volcano,约抽取了1/3的数据
# 插入等高线平面图,默认在zmin处插入,设定z轴显示范围
persp3D(z = Volcano, contour = TRUE, zlim= c(-200, 200), image = FALSE)
# 插入平面等高线图,插入等高线背景图,列表传参
persp3D(z = Volcano, x = x, y = y, scale = FALSE, # scale=FALSE表示x,y比例不变
contour = list(nlevels = 20, col = "blue"), # 设定等高线颜色为蓝色
zlim = c(-200, 200), expand = 0.2, # 设定z轴显示范围,expand = 0.2 表示z轴图形压缩
image = list(col = alpha.col(col = "magenta", # 给等高线图添加背景,col深浅与z轴相关
alpha = seq(from = 0, to = 1, len = 100)))) #
# 等高线同时插入到多个位置,自定义平面图位置,使用side参数,
persp3D(z = Volcano, contour = list(side = c("zmin", "z", "350")), # 等高线插入3个位置,
zlim = c(-100, 400), phi = 20, image = list(side = 350)) # 图太多了,拓展z轴范围
colvar颜色参数为与z维度一致的矩阵, 指定colvar参数后,图例就表现colvar值了,不在是z的值了。
library(plot3D)
# 默认inttype = 1
persp3D(z = Volcano, shade = 0.5, colkey = FALSE)
# 设定inttype = 2, 在colvar存在NA(默认Z存在NA时)时,更准确
persp3D(z = Volcano, inttype = 2, shade = 0.5, colkey = FALSE)
# 设定colvar参数
## 创建数据
x <- y <- seq(0, 2 * pi, length.out = 10)
z <- with(mesh(x, y), cos(x) * sin(y)) + runif(100) # runif生成100个随机分布随机数
cv <- matrix(0.5 * runif(100), nrow = 10) # 生成10*10矩阵
## 绘图,colvar指定随机颜色矩阵, 图例展示colvar值了
persp3D(x, y, z, colvar = cv) #
persp3D(x, y, z, colvar = cv, inttype = 2) # inttype=2能更好的展示colvar变量的分布
library(plot3D)
par(mfrow = c(2, 2))
# 创建数据
VV <- V2 <- volcano[10:15, 10:15] # 筛选地10到15行,10到15列的元素,6*6矩阵,并赋值给2个对象
V2[3:4, 3:4] <- NA # 更新矩阵元素,3到4行,3到4列更改为缺失值
V2[4, 5] <- NA # 4行5列对应元素更改为缺失值
# 二维网格图,展示colvar矩阵中NA缺失值分布
image2D(V2, border = "black") # x对应矩阵的行,y对应矩阵的列
# inttype = 1插值后,z的维度减少1行1列,变成了5*5矩阵
persp3D(z = VV, colvar = V2, inttype = 1, theta = 0, # inttype = 1插值后,缺失值增加,变成8个
phi = 20, border = "black", main = "inttype = 1") # 添加主标题
# inttype = 2插值后,z的维度不变,缺失值数量及分布不变。
persp3D(z = VV, colvar = V2, inttype = 2, theta = 0, # inttype =2插值后,缺失值数量及分布不变
phi = 20, border = "black", main = "inttype = 2") # 添加主标题
# inttype = 3插值后,z的维度减少1行1列,但colvar缺失值减少
persp3D(z = VV, colvar = V2, inttype = 3, theta = 0, # inttype = 3插值后,缺失值减少,变成1个
phi = 20, border = "black", main = "inttype = 3") # 添加主标题
panel.first参数用于指定box的panels类型,也可以使用函数在panels上添加绘制的图形对象。
library(plot3D)
par(mfrow = c(1, 1))
# 构建一个包含绘图对象的函数,在后面panel.first参数中调用
panelfirst <- function(trans) {
zticks <- seq(100, 180, by = 20) # 5个长度的向量
len <- length(zticks) # len = 5
# 用trans3D新建2个空间转化矩阵
XY0 <- trans3D(x = rep(1, len), y = rep(1, len), z = zticks, # trans3D函数与trans3d作用一样,
pmat = trans)
XY1 <- trans3D(x = rep(1, len), y = rep(61, len), z = zticks,
pmat = trans)
# 绘制第1个平面图,绘制几条虚线
segments(XY0$x, XY0$y, XY1$x, XY1$y, lty = 2) # R自带函数segments绘制虚线
rm <- rowMeans(volcano) # 在z中列为y, 行为x
XY <- trans3D(x = 1:87, y = rep(ncol(volcano), 87),
z = rm, pmat = trans)
# 绘制第2个平面图,绘制1条曲线
lines(XY, col = "green", lwd = 2)
}
# 绘图,设置panel.first参数,绘制panels中的图形, 将persp3D产生的空间转化矩阵代入panelfirst的trans
# panels添加顺序安装绘制顺序
persp3D(z = volcano, x = 1:87, y = 1: 61, scale = FALSE, theta = 10,
expand = 0.2, panel.first = panelfirst, colkey = FALSE)
library(plot3D)
# 设定col为gg.col色板(ggplot2默认色板)
persp3D(z = volcano, shade = 0.3, col = gg.col(100)) # 不指定colvar参数时,颜色与z坐标匹配
# lighting参数指定打光,光照类型还没搞懂怎样设置
persp3D(z = volcano, lighting = TRUE, lphi = 90)
# 自定义连续渐变色板
persp3D(z = volcano, shade = 0.3, col = ramp.col(col = c("cyan", "magenta"),
n = 102, alpha = 0.5))
# 设置颜色全部为灰蓝色,
persp3D(z = volcano, col = "lightblue", shade = 0.3, bty = "b2")
persp3D(z = volcano, col = "grey", shade = 0.3)
最后一个图层才设定plot = TRUE
library(plot3D)
clim <- range(volcano)
# 绘制第一个图层,
persp3D(z = volcano, zlim = c(100, 600), clim = clim,
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1),# clim 指定图例显示范围
box = FALSE, plot = FALSE)
# 绘制第2个图层,向z轴正向偏移200个单位, volcano设定等于原来的z轴
persp3D(z = volcano + 200, clim = clim, colvar = volcano,
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1), #
add = TRUE, colkey = FALSE, plot = FALSE)
# 绘制第3个图层,向z轴正向偏移400个单位
persp3D(z = volcano + 400, clim = clim, colvar = volcano,
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1),
add = TRUE, colkey = FALSE) # 默认plot = TRUE
3.3
ribbon3D()
ribbon3D()
与persp3D()
比较:
* z与persp3D()
中的数据不同,为了不形成封闭的网格,必须对volcano
数据集进行筛选行或筛选列。
* 通过设定along
参数指定方向条带方向,默认along = x。 * 增加了space
参数,设定条带之间的空白间隙量。默认space = 0.4。
along
参数volcano数据集列相当于y, 行相当于x。
筛选列,y不连续, 条带沿x方向。默认along = "x"
。
筛选行,x不连续, 条带沿y方向。设定along = "y"
。
不筛选数据,则设定along = "xy"
, 结果形成网状条带。
library(plot3D)
# 默认条带沿x方向
V <- volcano[, seq(1, ncol(volcano), by = 3)] ## 筛选数据集,筛选列,间隔2个列取1列数据
ribbon3D(z = V,
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1),
colkey = list(width = 0.5, length = 0.5, # 列表传递图例参数
cex.axis = 0.8, side = 2), clab = "m") # cex.axis坐标轴比例变为0.8倍
# 设定along = "y", 条带沿y方向, space = 0.3减小条带间隙
Vy <- volcano[seq(1, nrow(volcano), by = 3), ] ## 筛选数据集,筛选行,间隔2个行取1行数据
ribbon3D(z = Vy, expand = 0.3, space = 0.3, along = "y", # expand = 0.3,沿z轴压缩
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1),
colkey = list(width = 0.5, length = 0.5, cex.axis = 0.8))
# 不筛选数据,设定along = "xy", 形成网状条带。
x <- seq(-pi, pi, by = 0.2)
y <- seq(-pi, pi, by = 0.3)
grid <- mesh(x, y)
z <- with(grid, cos(x) * sin(y))
ribbon3D(z = z, x = x, y = y, along = "xy", space = 0.3,
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1))
library(plot3D)
x <- seq(1, nrow(volcano), by = 3) # 同时筛选数据
y <- seq(1, ncol(volcano), by = 3)
Volcano <- volcano[x, y]
ribbon3D(z = Volcano, zlim = c(-100, 200), col = ramp.col(col = c("cyan", "magenta"),
n = 102, alpha = 1), contour = TRUE, image = TRUE) # 默认image图形颜色与条带一致
3.4
hist3D()
hist3D()
特点:
同样有space
参数,但默认space = 0。
增加了一个opaque.top参数,用于指定bar顶面是否透明(当设定alpha时),默认opaque.top = FALSE不透明。
require(plot3D)
data(VADeaths) # 一个城市与农村不同年龄,不同性别人口数量数据集,
head(VADeaths) # 行相当于x即年龄分布。
# bty = "g"表示灰色背景panels和白色grid
hist3D(z = VADeaths,
scale = FALSE, expand = 0.01, bty = "g", theta = 290, phi = 20, # expand = 0.01,z轴方向压缩
col = "green", border = "magenta", shade = 0.2, ltheta = -290,
space = 0.3, ticktype = "detailed", d = 2) # 设定柱子间隙为0.3, d=2>1降低透视强度
text3D()
library(plot3D)
hist3D (x = 1:5, y = 1:4, z = VADeaths,
bty = "g", phi = 20, theta = -60,
xlab = NA, ylab = NA, zlab = "", main = "VADeaths", # main增加主标题
col = "green", border = "magenta", shade = 0.8,
ticktype = "detailed", space = 0.15, d = 2)
# 添加3维文字,给x轴增加刻度标签
text3D(x = 1:5, y = rep(-0.3, 5), z = rep(3, 5), # y相同,在x轴上增加刻度标签
labels = rownames(VADeaths),
add = TRUE, adj = 0)
# 添加3维文字,给y轴增加刻度标签
text3D(x = rep(0.5, 4), y = 1:4, z = rep(0, 4), # x相同
labels = colnames(VADeaths),
add = TRUE, adj = 1)
必须用alpha
参数设定bar透明度alpha
从0(全透明)到1(不透明)。
library(plot3D)
data(VADeaths) # 一个城市与农村不同年龄,不同性别人口数量数据集,
head(VADeaths) # 行相当于x即年龄分布。
# 设定图形透明度为0.3, opaque.top = TRUE表示顶部不透明
hist3D(z = VADeaths,
scale = FALSE, expand = 0.01, bty = "g", theta = 290, phi = 20, # expand = 0.01,z轴方向压缩
col = "green", border = "magenta", shade = 0.2, ltheta = -290, alpha = 0.3, opaque.top = TRUE,
space = 0.3, ticktype = "detailed", d = 2) # 设定柱子间隙为0.3, d=2>1降低透视强度
····
往期精彩:
R_插值_拟合_回归_样条
R_circlize包_和弦图(一)
R_circlize包_和弦图(二)
R_ggplot2基础(一)
R_ggplot2基础(二)
R_ggplot2基础(三)
R_ggplot2基础(四)
R_3D图(一)
····
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法