作者:李誉辉
四川大学在读研究生
前言
继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")