作者:李誉辉
四川大学在读研究生
前言
继R_ggplot2基础连载结束,今天开启R_3D图系列的连载。内容较丰富,大家可以收藏后在慢慢学习。你们的点赞和转发是对我最大的支持。
准备工作:
安装ggforce
包
devtools::install_github('thomasp85/ggforce')
install.packages("plot3D")
1.基础图形
persp()
persp()
函数在平面上绘制一个三维透视图,需要指定观察方向等信息。 persp()
函数用于绘制曲面,相当于z = f(x, y)函数绘图。
语法:
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", ...)
参数解释:
x, y, 表示x和y坐标,必须按照升序排列,默认从0到1等间距的数值,
如果x是一个含有2个元素的列表,这x\(x和x\)y则分别用于指定x,y。
z 为一个矩阵,表示z坐标。z也可以用x列表指定。
xlim, ylim, zlim,表示指定坐标轴显示范围,需要能够完全覆盖图形。
xlab, ylab,表示指定坐标轴标题内容,只能是字符串,数字也会被转成字符串。
main, sub, 表示指定主标题和副标题内容。
theta, phi, 指定观察方向,
theta指定左右角度(俯视图顺时针旋转为正),phi指定余纬度(上下角度,前视图顺时针旋转为正)。
r, 表示观测点与绘图立方体中心的距离。
d, 用于指定透视强度,d>1则将降低透视效果,d<1则将扩大透视效果。
scale, 表示3个坐标轴是否独立转化形成表面网格,TRUE
则x, y,z坐标轴各自独立转化,FALSE
则x, y,z坐标轴同比例缩放转化,以保留曲面真实曲率,在DEM地形图中很有用。
expand, 表示指定z轴缩放系数,expand < 1则z方向缩小,expand > 1则z方向放大。
col, 表示指定网格面的颜色,透明色将被忽略,循环赋予(nx-1)*(ny-1)个曲面网格面。
border, 表示指定网格线的颜色, 默认NULL对应par("fg")
前景颜色,前景颜色默认“black”。
值NA表示z对应边框颜色,当曲面有阴影时,关闭网格边线很有用。
ltheta, lphi, 表示指定打光方向,光线照射不到的地方将产生阴影。
ltheta(俯视图逆时针旋转为正)相当于改变房子的朝向, lphi(前视图逆时针为正)相当于太阳升起落下。
光线起始位置为沿z轴负方向。
与观察方向相反,是因为打光方向与如进入眼睛的光都是矢量。
shade, 表示指定阴影指数,曲面网格上的阴影通过公式: ((1+d)/2)^shade计算,
其中d表示垂直曲面网格的单位矢量与光源方向单位矢量的点积。
shade值相当于点光源模型中一个点产生的阴影,shade值趋近于0则不产生阴影。0.5至0.75效果类似日光照明。
box, 表示是否显box框线,默认TRUE显示。
axes, 表示是否显示绘图立方体的坐标轴刻度及刻度线标签。默认TRUE显示。
ticktype, 表示指定坐标轴类型,默认"simple"
表示仅仅绘制一个“箭头”,沿箭头方向数值逐渐增大。
“detailed”表示每个2维平面都绘制完整的坐标轴。box = FALSE
则不显示坐标轴。
nticks, 表示指定坐标轴刻度线数量(大约数量),若ticktype = "simple"
则失效。
…, 其它绘图参数,与par()
参数一样。
require(plot3D)
# 三维地图模型可视化
class(volcano)
[1] “matrix”
dim(volcano)
[1] 87 61
z <- 3 * volcano # 放大高度坐标
x <- 10 * (1:nrow(z)) # 相当于从南到北
y <- 10 * (1:ncol(z)) # 相当于从东到西
par(bg = "slategray") # 设定背景颜色为slategray
# 显示曲面网格,网格边线颜色为洋红,显示box框线
persp(x, y, z, theta = 135, phi = 30, col = "green3", scale = FALSE, ltheta = -120,
shade = 0.75, border = "magenta", box = TRUE)
# 不显示曲面网格,border = NA, 不显示box边框, expand>1放大z轴
persp(x, y, z, theta = 135, phi = 30, col = "green3", expand = 1.5, scale = FALSE,
ltheta = -120, shade = 0.75, border = NA, box = FALSE)
# 观察方向全部为0度。结果x轴从左到右,y轴从下到上。
persp(x, y, z, theta = 0, phi = 0, col = "green3", scale = FALSE, ltheta = -120,
shade = 0.75, border = NA, box = TRUE, ticktype = "simple")
# 观察方向:theta顺时针旋转45度(俯视图观测)
persp(x, y, z, theta = 45, phi = 0, col = "green3", scale = FALSE, ltheta = -120,
shade = 0.75, border = NA, box = TRUE, ticktype = "simple")
# 观察方向:phi顺时针旋转20度(前视图观测)
persp(x, y, z, theta = 45, phi = 20, col = "green3", scale = FALSE, ltheta = -120,
shade = 0.75, border = NA, box = TRUE, ticktype = "simple")
# 打光方向:ltheta=0, lphi = 0,
# 即光线向下直射到地面,结果阴影消失,相当于全亮。
persp(x, y, z, theta = 45, phi = 20, col = "yellow", scale = FALSE, ltheta = 0,
lphi = 0, shade = 0.75, border = NA, box = TRUE, ticktype = "simple")
# 打光方向:ltheta = -45, lphi = 0度,即入射光方向结果仅仅山脊右边有阴影。
persp(x, y, z, theta = 45, phi = 20, col = "yellow", scale = FALSE, ltheta = -45,
lphi = 0, shade = 1, border = NA, box = TRUE, ticktype = "simple")
# 打光方向:ltheta = -45, lphi = -10, 结果阴影越过了山脊,阴影覆盖区域增加。
persp(x, y, z, theta = 45, phi = 20, col = "yellow", scale = FALSE, ltheta = -45,
lphi = -10, shade = 1, border = NA, box = TRUE, ticktype = "simple")
# 打光方向:ltheta = -45, lphi = 10, 结果阴影后退,阴影覆盖区域减小。
persp(x, y, z, theta = 45, phi = 20, col = "yellow", scale = FALSE, ltheta = -45,
lphi = 10, shade = 1, border = NA, box = TRUE, ticktype = "simple")
1.1.2 根据数学关系z=f(x, y)绘制曲面,增加颜色映射
require(plot3D)
par(bg = "white") # 设置背景颜色为白色
x <- seq(-1.95, 1.95, length = 30)
y <- seq(-1.95, 1.95, length = 35)
z <- outer(x, y, function(a, b) a * b^2) # 根据函数关系计算x,y外积,生成网格
nrz <- nrow(z)
ncz <- ncol(z)
# 自定义组合调色板,生成渐变色条函数
jet.colors <- colorRampPalette(c("cyan", "magenta"))
nbcol <- 100
color <- jet.colors(nbcol) # 取自定义色板中100个颜色
# 计算曲面网格中心的z值
zfacet <- z[-1, -1] + z[-1, -ncz] + z[-nrz, -1] + z[-nrz, -ncz]
# 给网格中心z坐标增加分箱
facetcol <- cut(zfacet, nbcol) # 分箱,100个分割点,99段。
# 绘制三维曲面图,
persp(x, y, z, col = color[facetcol], phi = 30, theta = -30) # 颜色与分箱对应,一个箱体一种颜色
tran3d()
上添加几何对象tran3d(x, y, z, pmat)
tran3d()
通过一个4*4矩阵,将x, y, z三维坐标转化为透视图上的二维坐标。
可以在persp()
绘图对象上添加几何对象。
require(plot3D)
require(grDevices) # tran3d函数
# 数学公式生成网格坐标。
x <- seq(-10, 10, length = 30)
y <- x
f <- function(x, y) {
r <- sqrt(x^2 + y^2)
10 * sin(r)/r
} # 数学公式
z <- outer(x, y, f) # z不是x和y的简单运算,而是在函数f关系下作外积(向量叉乘)运算。才能形成网格。
z[is.na(z)] <- 1 # 缺失值更新为值1
op <- par(bg = "white") # 设置背景颜色为白色
# 绘制三维曲面
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "springgreen") # z轴缩短
res <- persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "springgreen",
ltheta = 120, shade = 0.75, ticktype = "detailed", xlab = "X", ylab = "Y",
zlab = "Sinc(r)")
# 返回4*4的矩阵,
round(res, 3) # 四舍五入,保留3位小数
[,1] [,2] [,3] [,4]
[1,] 0.087 -0.025 0.043 -0.043 [2,] 0.050 0.043 -0.075 0.075 [3,] 0.000 0.074 0.042 -0.042 [4,] 0.000 -0.273 -2.890 3.890
# 在persp绘图对象上插入几何对象,使用trans3d()函数,使用R自带绘图函数points和lines函数
xE <- c(-10, 10)
xy <- expand.grid(xE, xE) # expand.grid函数根据多个向量生成数据框
points(trans3d(xy[, 1], xy[, 2], 6, pmat = res), col = "magenta", pch = 16) # 16号点型
lines(trans3d(x, y = 10, z = 6 + sin(x), pmat = res), col = "magenta") # 增加一条正弦图
# 增加一个圆环线
phi <- seq(0, 2 * pi, len = 201)
r1 <- 7.725
xr <- r1 * cos(phi)
yr <- r1 * sin(phi)
lines(trans3d(xr, yr, f(xr, yr), res), col = "magenta", lwd = 2) # 圆环线宽为2
# 查看trans3d返回结果,结果为x,y坐标组成的列表
str(trans3d(xy[, 1], xy[, 2], 6, pmat = res))
List of 2 $ x: num [1:4] -0.412 0.149 -0.076 0.346 $ y: num [1:4] -0.0046 -0.2101 0.1766 0.0888
image2D()
及contour2D()
image2D()
扩展了可以绘制2维图(matrix数据)和3维图(array数据),也可以是列表数据源。
contour2D()
是R自带的contour
函数的扩展。
语法:
# 简单用法
image2D (z, ...)
# 仅仅绘制等高线
contour2D (z, x = seq(0, 1, length.out = nrow(z)),
y = seq(0, 1, length.out = ncol(z)), ...,
col = NULL, NAcol = NULL,
colkey = NULL, resfac = 1,
clab = NULL, add = FALSE, plot = TRUE)
## 数据源z是矩阵
image2D(z, x = seq(0, 1, length.out = nrow(z)),
y = seq(0, 1, length.out = ncol(z)), colvar = z, ...,
col = NULL, NAcol = "white", breaks = NULL,
border = NA, facets = TRUE, contour = FALSE,
colkey = NULL, resfac = 1, clab = NULL,
lighting = FALSE, shade = NA, ltheta = -135, lphi = 0,
theta = 0, rasterImage = FALSE,
add = FALSE, plot = TRUE)
# 数据源z是数组
image2D(z, margin = c(1, 2), subset, ask = NULL, ...)
# 数据源z是列表
image2D(z, ...)
参数解释:
z 表示数据源, 可以是2维矩阵或3维数组,也可以是元素为矩阵或数组的列表。
默认colvar=z, 但当shade和lighting参数为激活时,colvar与z显示效果不同。
x, y 表示x,y轴坐标,如果是向量,要求length(x) = nrow(z), length(y) = ncol(z)。
如果是矩阵(only for image2D), 要求其维度等于dim(z)或dim(z) + 1,具体取决于插值方法。
colvar, 用于指定着色变量,其维度与z相同,仅仅当shade和lighting参数激活时有效。
col, 指定着色色板,色板函数xxx.col()
。
NAcol, 指定z中缺失值对应的颜色,对于image2D
,默认“white”, 对于contour
,默认不绘制。
breaks, 为数字向量,表示颜色标度断点,默认增序排列,无序向量会自动排序。
contour, 表示是否给图片增加等高线, 默认FALSE不增加,TRUE则增加等高线(x,y为矩阵时例外),
同样可以用列表传参指定contour
参数。
colkey, 为逻辑值或NULL(默认)或列表传参,表示是否显示图例,或指定图例参数。
clab, 表示指定图例标题内容,默认图例标题与主标题高度一致,
如果要降低图例标题位置,可以使用向量指定,向量第一个元素为空字符串,如c("", "我是lengend")
。
resfac, 表示指定x和y方向的分辨率因子,用长度为1或2的数字向量指定,
数字大于1,则增加分辨率,通过增加插值z的数量。若向量长度为1,则在x和y对应的z插值数量相同。
lighting, 为逻辑值或列表指定,表示对曲面网格网格打光,TRUE
(默认list)和list都会打光。
list指定光照类型和强度:ambient环境光, diffuse漫反射, specular镜面反射,
exponent颜色数字, sr阳光反射指数, alpha透明度。如:lighting = list(exponent = 5)
。
lighting 权限高于shade参数。
shade, 表示指定阴影指数,默认NA不产生阴影,shade值相当于点光源模型中一个点产生的阴影,
shade值趋近于0则不产生阴影。0.5至0.75效果类似日光照明。
ltheta, lphi, 表示指定产生shade的打光方向,与persp()
中一致。
theta, 表示指定观察方向,因为是平面图形,所以没有phi
参数,与persp()
中一致。
border, 表示指定网格线的颜色,默认NA不显示网格线。
facets, 为逻辑值或NA,表示是否显示网格面, 默认TRUE显示网格面,
FALSE则显示白色网格面,并将col参数赋予网格线着色。NA则表示网格面透明。
rasterImage, 为逻辑值,表示是否绘制栅格图像,默认FALSE不绘制,TRUE表示只绘制栅格图像。
rasterImage采用线性插值栅格图像,看起来过渡更平滑。
add, 为逻辑值,表示是否添加到现有的绘图的中,默认FALSE不添加而是新建。
plot, 为逻辑值,表示是否立即绘制图形,默认TRUE绘制,
FALSE则传递几个矩阵作为参数给下一个绘图对象,最后一个绘图对象才plot = TRUE。
margin,应用于当z是数组时。指定图片的边框,具体的没看懂,不过用得也比较少。
ask, 为逻辑值, 同样应用z是数组时,当同时绘制多图时,用于交互设置,具体见?dev.interactive
。
…, 其它公共参数,如alph
指定透明度,从0(全透明)到1(不透明)。lty
线型,lwd
线宽。
levels, 数字向量,表示指定等高线梯度。在图例相当于breaks
参数。
library(plot3D)
par(mfrow = c(2, 2)) # 多图排版,2*2矩阵排列
x <- y <- 1:3
z <- matrix (data = 1:9, nrow = 3, ncol = 3)
image2D(z, x, y, border = "yellow", lwd = 3, # border设置网格线颜色,lwd设置线宽。
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1))
image2D(z, x, y, rasterImage = TRUE, border = "yellow", lwd = 2,
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1))
image2D(z, x = matrix(nrow = 3, ncol = 3, data = x),
y, border = "yellow", lwd = 2, lty = 2, # lty线型为虚线
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1))
image2D(z, x, y, border = "yellow", lwd = 2, theta = 45,
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1))
breaks
参数包含端点,所以其长度比col
长度大1个。
library(plot3D)
par(mfrow = c(2, 2))
nr <- nrow(volcano)
nc <- ncol(volcano)
image2D(volcano, x = 1:nr, y = 1:nc, lighting = TRUE,
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1),
main = "volcano", clab = "height, m") # main主标题,clab图例标题,向量指定多个标题
# 给已存在的image2D添加直线,length(unique(as.vector(volcano))) = 102
abline(v = seq(10, 80, by = 10), col = "yellow")
abline(h = seq(10, 60, by = 10), col = "yellow")
# 给已存在的image2D添加点。
points(50, 30, pch = 13, cex = 4, lwd = 2, col = "tomato") # pch点型,cex点相对大小,lwd点线条宽度
image2D(z = volcano, x = 1:nr, y = 1:nc, lwd = 2, shade = 0.1, # shade阴影指数0.1几乎没有阴影
col = ramp.col(col = c("cyan", "magenta"), n = 102, alpha = 1), #
main = "volcano", clab = "height, m", colkey = list(col.clab = "tomato")) # colkey列表传参改变
image2D(volcano, x = 1:nr, y = 1:nc, shade = 0.5, lphi = 0, # shade阴影指数0.5很大
contour = list(col = "magenta"), # contour列表传参,等高线颜色为洋红
col = "cyan", main = "volcano")
# 设定breaks参数, breaks参数包含端点,col参数长度为颜色段数量,不包含端点,
breaks <- seq(90, 200, by = 15)
image2D(volcano, x = 1:nr, y = 1:nc,
col = ramp.col(col = c("cyan", "magenta"), n = length(breaks)-1, alpha = 1), # 颜色段数n
contour = list(col = "black"), # 增加等高线
main = "volcano", clab = "height, m", breaks = breaks) # 指定breaks参数
col 映射形成多彩等高线。
levels 数字向量,指定等高线梯度,相当于image2D
中的breaks参数。图例刻度与levels对应。
levels参数与breaks参数不同的是,levels与没有端点,长度等于col参数。
library(plot3D)
par(mfrow = c(2, 2))
V <- volcano - 150 # range(V): -56, 45
# 默认,无图例
contour2D(z = V, colkey = FALSE, lwd = 2)
# levels指定等高线梯度, 相当于image2D中的breaks,图例刻度与levels对应
contour2D(z = V, lwd = 2, levels = seq(-40, 40, by = 20), col = ramp.col(col = c("blue",
"cyan", "magenta"), n = 5)) # levels参数
# 新建等高线,levels仅仅取正数,
contour2D(z = V, lwd = 2, colkey = FALSE, col = ramp.col(col = c("magenta",
"green"), n = 2), levels = seq(0, 40, by = 20))
## 插入等高线,levels取负数,负值用虚线表示
contour2D(z = V, lwd = 2, lty = 2, colkey = FALSE, col = ramp.col(col = c("blue",
"green3"), n = 2), levels = seq(-40, -20, by = 20), add = TRUE)
## 插入合并后的图例:
colkey(side = 4, add = TRUE, clab = "Volcano", col = ramp.col(col = c("blue",
"green3", "green", "magenta"), n = 4), breaks = seq(-40, 40, by = 20), col.clab = "tomato")
# contour2D, 没有levels,用nlevels参数指定等高线数量,更加方便快捷
contour2D(z = V, lwd = 2, nlevels = 20, drawlabels = FALSE, colkey = list(at = seq(-40,
40, by = 20)))
image2D()
中的所有参数都可以使用列表传参。
library(plot3D)
# list包含2个矩阵数据源
listvolcano <- list(volcano = volcano, logvolcano = log(volcano))
# 使用list数据源绘图
image2D(listvolcano, x = 1:nr, y = 1:nc, contour = TRUE,
main = c("volcano", "log(volcano)"), # 列表传递多个参数
clab = list("height, m", "log(m)"),
zlim = list(c(80, 200), c(4.4, 5.5))) # 同样zlim只能限制坐标轴范围,默认限制图例刻度范围
z轴对应颜色,对数运算后,颜色过渡更加平缓。标度数字不改变。 增加log参数。log = "z
,表示对z轴对数运算,当然也可以对其它轴对数运算,但地图比例就发生了变化。
library(plot3D)
par(mfrow = c(1, 2))
# 普通
image2D(volcano, clab = c("height", "m"))
# 对z对数运算,颜色过渡更加平缓,标度数字不改变,图例并不变
image2D(volcano, log = "z", clab = c("height", "m"), main = "log='z'")
# 包含NA,默认NA颜色为白色,结果四周变成白色
VOLC <- volcano - 110
VOLC[VOLC <= 0] <- NA # 更新数据,小于等于0的元素全为缺失值
image2D(VOLC, main = "including NAs and rescaled")
# 设置NA颜色为黑色,结果四周变成黑色,同时z轴对数变换
image2D(VOLC, NAcol = "black", log = "z", zlim = c(1, 100), main = "NAs and log = 'z'")
library(plot3D)
par(mfrow = c(1, 2))
# image2D中列表传递contour参数同时绘制等高线
image2D(volcano, shade = 0.2, rasterImage = TRUE,
contour = list(col = "tomato", labcex = 0.8, lwd = 3, alpha = 0.5)) # labcex设置等高线文字大小
# 2个图层叠加,先绘制image2D底图,然后contour2D添加等高线,结果一样
image2D(z = volcano, shade = 0.2, rasterImage = TRUE)
contour2D(z = volcano, col = "tomato", labcex = 1.2, # 增加等高线文字大小
lwd = 3, alpha = 0.5, add = TRUE)
image3D()
image3D()
在一个3维绘图对象中添加一个平面图。
多个图层叠加时,通常在第一个图设置背景格式,并留出图例位置,在最后一个图绘制图例
语法:
image3D (x = NULL, y = NULL, z = NULL, ..., colvar = NULL,
phi = 40, theta = 40, col = NULL,
NAcol = "white", breaks = NULL, border = NA, facets = TRUE,
colkey = NULL, resfac = 1, panel.first = NULL,
clim = NULL, clab = NULL, bty = "b",
inttype = 1, add = FALSE, plot = TRUE)
参数解释:
x, y, z 为坐标参数,为数字向量,其中至少一个数字向量长度必须为1,这表示该平面图绘制在什么位置上。
当x长度为1时,表示平行于y-z平面;当y长度为1时,表示平行于x-z平面。同理length(z)=1平行于x-y平面。
如果指定2个向量,这第1个向量长度应该等于nrow(colvar)
, 第2个向量长度等于ncol(colvar)
。
colvar, 同样表示指定要着色的变量。默认colvar = NULL
, 不是colvar = z,因为是平面图。
col, 表示指定色板。
NAcol, 表示缺失值的颜色,默认为白色。
breaks, 同样表示colvar
变量的断点(包括端点),默认图例刻度端点为breaks。
colkey, 为逻辑值或NULL(默认), 也可以用列表传递colkey
参数。
当colkey = NULL
时,若col
参数是一个向量,才会自动添加图例,col
参数是一个字符串则不添加图例。
设定colkey = list(plot = FALSE)
则为图例留下空间,但不显示图例。colkey = FALSE
则不绘制图例。
clab, 表示指定图例标题内容,仅当colkey = TRUE
时有效,
默认位置于主标题同一高度,降低高度,使用向量指定,第一个元素为空字符串。
clim, 表示指定colvar
的显示范围,仅仅当colvar
被指定时生效,超出范围的colvar
将作为NA显示。
resfac, 表示指定x,y坐标轴方向的插值精度,用长度为1或2的整数向量指定,数字越大,表示精度越高。
默认resfac = 1, 向量长度为1时,表示x,y两个方向的精度一样,长度为2则分别指定两个方向的精度。
theta, phi, 表示指定观察方向,与persp()
中一样。
border, 表示指定网格线的颜色,默认border = NA
不显示网格线。
facets, 为逻辑值或NA, 表示是否显示网格面, 默认TRUE显示网格面, FALSE则显示白色网格面,并将col参数赋予网格线着色。NA则表示网格面透明。
panel.first, 表示指定一种变换函数,常常用于绘制背景网格和三维散点图的平滑处理。
该函数的其中一个参数应该是pmat矩阵变换。见persp3D()
中的例子。
bty, 表示指定box的类型,默认仅仅画背景panels,只有当persp()
中的box = TRUE
时才有效。
其它与perspbox()
函数中一致,bty = c(“b”, “b2”, “f”, “g”, “bl”, “bl2”, “u”, “n”)其中之一。
inttype, 表示指定生成网格多边形的插值类型,默认inttype = 1
,inttype = 3
表示不代入NA计算,inttype = 2
更加适合存在大量NA的情况,但网格维度会增加1行1列。 具体见persp3D()
中的例子。
add, 表示是否将该绘图对象加入到已存在的绘图对象中,TRUE相当于增加图层,默认FALSE则新建。
plot, 表示是否立即绘图,默认TRUE则立即绘图,FALSE则往下传递绘图参数,直到最后一个图层一起绘制。
…, 表示其它参数,包括公共参数, persp()
中的参数,perspbox()
中的一些参数。persp()
中的一些参数:xlim, ylim, zlim, xlab, ylab, zlab, main, sub, r, d, scale, expand, box, axes, nticks, ticktype。
同样xlim,ylim, zlim也只限制坐标轴范围,超出该范围的图形仍然会绘制出来,
使用plotdev()
设定图形范围。perspbox()
中的一些参数: col.axis, col.panel, lwd.panel, col.grid, lwd.grid。
公共参数:alpha
透明度,从0(全透明)到1(不透明)。lty
线型,lwd
线宽用于指定网格线,当border
不是NA有效。
shade和lighting对平面网格图没有任何作用。
library(plot3D)
par(bg = "#ffffb3") # 设置背景颜色为淡黄色
# 同时绘制3个平面,1个平面平行于y-z平面,1个平行于x-z平面,1个平行于x-y平面
## 绘制x=0.5平面,平行于y-z平面
image3D(y = seq(0, 1, 0.1), z = seq(0, 1, 0.1), x = 0.5,
col = "cyan", xlim = c(0,1), alpha = 0.5, # xlim设定坐标轴范围,col指定平面颜色。alpha透明度
colkey = list(plot = FALSE), # 使用colkey = list(plot=FALSE)留出图例区域。
bty = "u", col.axis = "blue", col.panel = NA) # 手动设置背景格式,col.panel=NA表示透明panels
## 绘制 y = 0.5平面,平行于x-z平面
image3D(x = seq(0, 1, 0.1), z = seq(0, 1, 0.1), y = 0.4,
add = TRUE, col = "purple", alpha = 0.8) # alpha指定透明度
## 绘制 z= 0.5平面,其平行于x-y平面
image3D(x = seq(0, 1, 0.1), y = seq(0, 1, 0.1), z = 0.3,
add = TRUE, col = "magenta", alpha = 0.5) # alpha指定透明度
## 增加图例
colkey(col = c("magenta", "purple", "cyan"), clim = c(0.5, 3.5),
at = 1:3, labels = c("z", "y", "x"), add = TRUE,
dist = -0.1, length = 0.5, col.axis = "blue")
# 增加colvar参数,给colvar着色,绘图位置在z=100平面
image3D(z = 100, colvar = volcano, zlim = c(0, 150),
col = ramp.col(col = c("cyan", "magenta"), n = 102), # 指定颜色色板
colkey = list(clab = c("height", "m"), length = 0.5, dist = -0.1), # 列表传参设定图例
bty = "u", col.panel = NA) # 手动设定背景
# 绘制位置在x = 0.5平面,
image3D(x = 0.5, colvar = volcano, xlim = c(0, 1),
ylim = c(0, 1), zlim = c(0, 1),
col = ramp.col(col = c("cyan", "magenta"), n = 102), # 指定颜色色板
colkey = list(plot = FALSE), # 使用colkey = list(plot=FALSE)留出图例区域。
bty = "u", col.panel = NA) # 手动设定背景
## 添加第二个平面图,位置在y = 0.5平面
image3D(y = 0.5, colvar = volcano, add = TRUE,clab = c("height", "m"),
col = ramp.col(col = c("cyan", "magenta"), n = 102), # 指定颜色色板
colkey = list(length = 0.5, dist = -0.1)) # 列表传参设定图例
# 绘制3个图叠加
image3D(z = 1, colvar = volcano,
x = seq(0, 1, length.out = nrow(volcano)),
y = seq(0, 1, length.out = ncol(volcano)),
col = ramp.col(col = c("green", "purple"), n = 102), # 指定颜色色板
colkey = list(length = 0.5, plot = FALSE, dist = -0.1), # 列表传参绘制空白图例
xlim = c(0, 2), ylim = c(0, 2), zlim = c(0, 2),
bty = "u", col.panel = NA) # 手动设定背景
image3D(y = 2, colvar = volcano, add = TRUE,
x = seq(0, 1, length.out = nrow(volcano)),
z = seq(1, 2, length.out = ncol(volcano)),
col = ramp.col(col = c("green", "purple"), n = 102), # 指定颜色色板
colkey = list(length = 0.5,dist = -0.1)) # 列表传参绘制图例
image3D(x = 2, colvar = NULL, col = "cyan", add = TRUE, # col为字符串,不是向量,默认不绘制图例
y = seq(0, 1, length.out = nrow(volcano)),
z = seq(1, 2, length.out = ncol(volcano)))
····
往期精彩:
R_插值_拟合_回归_样条
R_circlize包_和弦图(一)
R_circlize包_和弦图(二)
R_ggplot2基础(一)
R_ggplot2基础(二)
R_ggplot2基础(三)
R_ggplot2基础(四)
····
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法