如何增加 3D 绘图中表面网格线之间的间距?

问题描述 投票:0回答:1

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

By 1

该对象非常“尖锐”,因为只有几个数据点。因此,让我们通过在两个连续的

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)

By .01

该物体看起来不再那么“前卫”,这很好。但表面网格线彼此非常接近,几乎无法看到它们。如何制作一个绘图,以小步长但网格线之间有更大的空间,使用更大数据集的完整信息?我所期望的是这样的:

What I want

(这是用油漆做的。狭窄的网格线在这里是灰色的,但实际上它们根本不应该存在,我只是需要它们在油漆中绘制对象。但重点是:这里我们的网格之间有很大的间隙线条,但物体不是“尖锐”而是光滑。)


编辑:评论建议省略数据。这样做只会使对象变得“前卫”,如上图所示。所以这不是一个解决方案。

r plot 3d
1个回答
0
投票

评论建议对曲面进行子集化,但这不起作用,因为线条不会落在弯曲的实体部分内。做到这一点的方法是“手动”绘制网格线。 这是一个例子:

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)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.