我使用
rgl
包制作 3D 绘图。这是一些代码:
# Plot function.
my_plot <- function(x, y, z){
colours <- heat.colors(length(unique(z))); minval <- min(z); maxval <- max(z) + 10
col <- colours[(z - minval)/(maxval - minval)*99 + 1]
rgl::persp3d(x, y, z, col= col)
rgl::surface3d(x, y, z, front = "lines")
rgl::surface3d(x, y, z, back = "lines")
}
# Dummy data.
x <- seq(-2, 2, length = 7)
y <- seq(-3, 3, length = 5) # I've chosen different ranges
z <- outer(x, y, function(x, y) x + y^2)
# Make a plot.
my_plot(x, y, z)
这个情节对我来说看起来不错。但是,网格线之间的间距取决于输入数据的比例。如果我们在
seq
中生成较小步长的数据,那么绘图看起来会有所不同:
x <- seq(-2, 2, length = 100)
y <- seq(-3, 3, length = 100) # I've chosen different ranges
z <- outer(x, y, function(x, y) x + y^2)
my_plot(x, y, z)
我的实际数据在 x 和 y 上有微小的步长,因此生成的网格线非常窄。如何调整网格线的空间?我正在寻找类似
resfac
中的 plot3D::persp3D
参数(不幸的是,plot3D
有不同的其他缺点,这就是为什么我想坚持使用 rgl
包)。换句话说:我们怎样才能获得像上图中那样在 x 和 y 上步幅较小的第二个虚拟数据的更宽间距的网格线?
评论建议对曲面进行子集化,但这不起作用,因为线条不会落在弯曲的实体部分内。做到这一点的方法是“手动”绘制网格线。 这是一个例子:
library(rgl)
my_plot <- function(x, y, z, numLines = 6){
colours <- heat.colors(100); minval <- min(z); maxval <- max(z)
col <- colours[(z - minval)/(maxval - minval)*99 + 1]
dim(col) <- dim(z)
rgl::persp3d(x, y, z, col= col, polygon_offset = 1)
numLines <- rep_len(numLines, 2)
xind <- round(seq(1, length(x), length.out = numLines[1]))
yind <- round(seq(1, length(y), length.out = numLines[2]))
for (i in xind)
lines3d(x[i], y, z[i,], col = "black")
for (j in yind)
lines3d(x, y[j], z[,j], col = "black")
}
x <- seq(-2, 2, length = 100)
y <- seq(-3, 3, length = 100) # I've chosen different ranges
z <- outer(x, y, function(x, y) x + y^2)
my_plot(x, y, z)