R_3D图(一)

浏览: 180

作者:李誉辉  

四川大学在读研究生 

前言

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)))

····

往期精彩:

R_插值_拟合_回归_样条

R_circlize包_和弦图(一)

R_circlize包_和弦图(二)

R_ggplot2基础(一)

R_ggplot2基础(二)

R_ggplot2基础(三)

R_ggplot2基础(四

····

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战  
回复 Python       1小时破冰入门

回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

推荐 1
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册