2

我正在尝试在使用persp3D(package 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 绘图

尽管结果接近我的预期,但仔细观察会发现网格并没有真正位于现有表面之上,它是一个与原始表面不匹配的全新表面(这很明显,鉴于它是一个不同的矩阵)。

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

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

关于解决这个问题的任何想法?

4

1 回答 1

2

您可以直接在调用中添加网格persp3D

persp3D(z=volcano, border="black", lwd=0.3)

在此处输入图像描述

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

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

在此处输入图像描述

于 2018-02-02T20:05:48.093 回答