【问题标题】:Add grid over 3D surface using persp3D (plot3D package)使用 persp3D(plot3D 包)在 3D 表面上添加网格
【发布时间】:2018-02-02 19:50:07
【问题描述】:

我正在尝试在使用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))

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

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

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

对解决这个问题有什么想法吗?

【问题讨论】:

    标签: r plot3d


    【解决方案1】:

    你可以在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)
    

    【讨论】:

    • 是的,但那是来自原始矩阵的网格。我正在寻找一种使用“更大”单元格绘制子集网格的方法
    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2016-12-31
    • 2016-04-07
    • 2013-11-01
    相关资源
    最近更新 更多