我做 3D 绘图,我的问题是我不知道如何调整表面网格线的宽度。看这个例子:
x <- seq(-2, 2, by= 1); y <- seq(-3, 3, by= 1); z <- outer(x, y, function(x, y) x + y^2)
graphics::persp(x, y, z, phi= 25, theta= -115)
该对象非常“尖锐”,因为只有几个数据点。因此,让我们通过在两个连续的
x
和 y
值之间使用更小的步长来生成更多数据。我们所做的是将 by
中的 seq()
参数从 1
更改为 .01
:
x <- seq(-2, 2, by= .01); y <- seq(-3, 3, by= .01); z <- outer(x, y, function(x, y) x + y^2)
graphics::persp(x, y, z, phi= 25, theta= -115)
该物体看起来不再那么“前卫”,这很好。但表面网格线彼此非常接近,几乎无法看到它们。如何制作一个绘图,以小步长但网格线之间有更大的空间,使用更大数据集的完整信息?我所期望的是这样的:
(这是用油漆做的。狭窄的网格线在这里是灰色的,但实际上它们根本不应该存在,我只是需要它们在油漆中绘制对象。但重点是:这里我们的网格之间有很大的间隙线条,但物体不是“尖锐”而是光滑。)
编辑:评论建议省略数据。这样做只会使对象变得“前卫”,如上图所示。所以这不是一个解决方案。
评论建议对曲面进行子集化,但这不起作用,因为线条不会落在弯曲的实体部分内。做到这一点的方法是“手动”绘制网格线。 这是一个例子:
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)