使用persp3D(plot3D包)在3D表面上添加网格

时间:2018-02-02 19:50:07

标签: r matrix 3d

我正在尝试在使用persp3D(包plot3D)创建的3D表面顶部添加网格,但是我无法在不造成变形的情况下对其进行排序。网格。

library(plot3D)
data("volcano")

volcano是一个3D矩阵,可以通过简单地调用:

来创建3D图
persp3D(z=volcano)

我打算做的是使用3D矩阵的尺寸创建一个新网格,然后将其添加到3D图中。

# new grid
x.seq <- seq(1, dim(volcano)[1], length = 20)
y.seq <- seq(1, dim(volcano)[2], length = 20)

# Visualize grid
plot(x=c(0,length(volcano[,1])), y=c(0,length(volcano[1,])), type='n')
abline(v=x.seq, h=y.seq)

我接近它,通过创建新序列的矩阵volcano,然后在原始3D表面上绘制新的3D矩阵。

# New matrix using sequences created
mtx.sub <- volcano[time.seq, freq.seq]

# Plot new matrix on top of original surface
persp3D(z=volcano)
persp3D(z=amp.sub, border="black", facets=NA, add=T, colkey=list(plot=F))

3D plot with overlayed grid

即使结果接近我的预期,仔细观察也会发现网格实际上不在现有表面的顶部,它是一个与原始表面不匹配的全新表面(这很明显鉴于它是一个不同的矩阵。)

我正在寻找的是一种添加2D网格的方法,该网格将覆盖原始曲面,类似于abline,但是用于3D绘图。

我查看了plot3D文档并在网上搜索过,但没有一个解决方案适用于persp3D

对此有何看法?

1 个答案:

答案 0 :(得分:0)

您可以直接在persp3D

的调用中添加网格
persp3D(z=volcano, border="black", lwd=0.3)

enter image description here

为了回应你的评论,你可以用较低的分辨率绘制以获得更宽的边界,但是,表面也将具有较低的分辨率(见下文)。能够以全分辨率绘制表面并且然后具有仍然与高分辨率表面匹配的边界线的稀疏网络将是很好的,例如,通过仅在每个其他面上绘制边界线,但是我是不知道如何在不攻击persp3D(或persp3D调用的函数之一)的情况下如何做到这一点。

persp3D(z=volcano[seq(1,nrow(volcano),2), seq(1,ncol(volcano),2)], 
        border="black", lwd=0.4)

enter image description here