如何增加rgl::surface3d中网格线之间的间距?

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

我使用

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)

big space

这个情节对我来说看起来不错。但是,网格线之间的间距取决于输入数据的比例。如果我们在

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)

narrow grid

我的实际数据在 x 和 y 上有微小的步长,因此生成的网格线非常窄。如何调整网格线的空间?我正在寻找类似

resfac
中的
plot3D::persp3D
参数(不幸的是,
plot3D
有不同的其他缺点,这就是为什么我想坚持使用
rgl
包)。换句话说:我们怎样才能获得像上图中那样在 x 和 y 上步幅较小的第二个虚拟数据的更宽间距的网格线?

r plot 3d
1个回答
1
投票

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

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.