R_3D图(一)

栏目: R语言 · 发布时间: 5年前

作者: 李誉辉

四川大学在读研究生 

前言

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() 参数一样。

R_3D图(一)

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)

R_3D图(一)

R_3D图(一)

# 不显示曲面网格,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)

R_3D图(一)

R_3D图(一)

# 观察方向全部为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")

R_3D图(一)

R_3D图(一)

# 观察方向: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")

R_3D图(一)

R_3D图(一)

# 观察方向: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")

R_3D图(一)

R_3D图(一)

# 打光方向: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")

R_3D图(一)

R_3D图(一)

# 打光方向: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")

R_3D图(一)

R_3D图(一)

# 打光方向: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")

R_3D图(一)

# 打光方向: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")

R_3D图(一)

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)  # 颜色与分箱对应,一个箱体一种颜色

R_3D图(一)

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轴缩短

R_3D图(一)

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

R_3D图(一)

# 查看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 参数。

R_3D图(一)

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

R_3D图(一)

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参数

R_3D图(一)

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

R_3D图(一)

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只能限制坐标轴范围,默认限制图例刻度范围

R_3D图(一)

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

R_3D图(一)

R_3D图(一)

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)

R_3D图(一)

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对平面网格图没有任何作用。

R_3D图(一)

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_3D图(一)

R_3D图(一)

R_3D图(一)

R_3D图(一)

····

往期精彩:

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

R_circlize包_和弦图(一)

R_circlize包_和弦图(二)

R_ggplot2基础(一)

R_ggplot2基础(二)

R_ggplot2基础(三)

R_ggplot2基础(四

····

R_3D图(一)

R_3D图(一)

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

回复 爬虫 爬虫三大案例实战  

Python

1小时破冰入门

回复 数据挖掘  R语言入门及数据挖掘

回复  人工智能 三个月入门人工智能

回复  数据分析师 数据分析师成长之路 

回复 机器学习 机器学习的商业应用

回复  数据科学 数据科学实战

常用算法

常用数据挖掘算法

R_3D图(一)

本文由R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。

转载、引用前需联系作者,并署名作者且注明文章出处。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

密码学原理与实践

密码学原理与实践

[加]Douglas R.Stinson / 冯登国 / 电子工业出版社 / 2009年 / 55.00元

冯登国(FENG Dengguo,1965.5~), 现为中国科学院软件所研究员、博士生导师,信息安全国家重点实验室主任,国家计算机网络入侵防范中心主任,国家信息化专家咨询委员会委员。目前主要从事信息与网络安全方面的研究与开发工作。一起来看看 《密码学原理与实践》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换