作者: 李誉辉
四川大学在读研究生
前言
继 R_ggplot2基础 连载结束,今天开启R_3D图系列的连载。内容较丰富,大家可以收藏后在慢慢学习。你们的点赞和转发是对我最大的支持。
准备工作:
安装 ggforce
包
devtools::install_github('thomasp85/ggforce') install.packages("plot3D")
1.基础图形
1.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()
参数一样。
1.1.1 DEM地形图
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) # 颜色与分箱对应,一个箱体一种颜色
1.1.3 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
1.2 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))
1.2.1 breaks参数
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参数
1.2.2 contour等高线
-
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)))
1.2.3 list传递数据源绘制多图
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只能限制坐标轴范围,默认限制图例刻度范围
1.2.4 z轴对数运算
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'")
1.2.5 列表传参与多个绘图对象叠加结果一样
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)
1.3 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)))
····
往期精彩:
····
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
Python
1小时破冰入门
回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
常用算法
常用数据挖掘算法
本文由R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
密码学原理与实践
[加]Douglas R.Stinson / 冯登国 / 电子工业出版社 / 2009年 / 55.00元
冯登国(FENG Dengguo,1965.5~), 现为中国科学院软件所研究员、博士生导师,信息安全国家重点实验室主任,国家计算机网络入侵防范中心主任,国家信息化专家咨询委员会委员。目前主要从事信息与网络安全方面的研究与开发工作。一起来看看 《密码学原理与实践》 这本书的介绍吧!