【问题标题】:Adding Points to persp3D plot向 persp3D 绘图添加点
【发布时间】:2017-07-13 21:10:09
【问题描述】:

我正在进行一项比较差分进化和粒子群优化性能的研究,我需要能够将人口点添加到 3D 图上。我已经查看了Adding points to 3d plot in r,但该解决方案似乎不适用于我的情况,我不知道为什么。我正在采用众所周知的 G2 函数并使用 persp3D() 如下:

G2 <- function(x) {
    if (x[1] >= 0 & x[1] <= 10 & x[2] >= 0 & x[2] <= 10 &
        x[1] * x[2] >= 0.75 & x[1] + x[2] <= 15) {
        s <- cos(x[1]) ^ 4 + cos(x[2]) ^ 4
        p <- 2 * cos(x[1]) ^ 2 * cos(x[2]) ^ 2
        r <- sqrt(x[1] ^ 2 + 2 * x[2] ^ 2)
        f <- -abs((s - p) / r)
    } else {
        f <- 0
    }
    return(f)
}

x = y = seq(0, 10, .1)
data = data.frame(matrix(nrow = length(x), ncol = length(y)))
names(data) = y
rownames(data) = x

#Fill in data.frame with G2 values
for (i in 1:length(x)) {
    for (j in 1:length(y)) {
        z = G2(c(x[i], y[j]))
        data[i,j] = z
}
}

zlim = -range(data)
z = as.matrix(data)
par(mfrow = c(1, 1))
windows()
library(plot3D)
persp3D(z = -z, xlab = "x1", bty = "bl2",
    ylab = "x2", zlab = "G2", clab = "depth of G2",
    expand = 0.5, d = 2, phi = 20, theta = 30, resfac = 2,
    image = TRUE, 
    contour = list(col = "grey", side = c("zmin", "z")),
    zlim = zlim, colkey = list(side = 1, length = 0.5))

所有这些都很好,我得到了我正在寻找的情节。但是,当我尝试添加点时,如上面引用的解决方案中所建议的那样,我的 3D 图会重新生成为只有一个红点的图:

points3D(1, 1, G2(c(1,1)), col = "red", size = 30)

如何简单地将这一点添加到现有的 persp3D() 图中?另外,我可以控制点的添加位置(意味着等高线图或 3D 图像?我的目的是随着算法的发展添加人口,并创建 GIF 以便于可视化,但我不想下车,所以我只是尝试将这一点添加到情节中来简化。感谢您的帮助!

【问题讨论】:

    标签: r plot 3d


    【解决方案1】:

    简单的修复;)

    points3D(1, 1, G2(c(1,1)), col = "red", size = 30, add=T)

    【讨论】:

    • 谢谢,但在这种特殊情况下,当我添加这条线时,3D 绘图会重新渲染,并且该点不可见。我认为它隐藏在情节本身的轮廓中。有没有办法指定将点添加到上面的等高线图中,而不是图的 3D 部分?如果你运行我的代码,你就会明白我的意思。谢谢!
    • 你确定吗?这个对我有用。我在图片上添加了一个箭头来指示该点的位置。
    • 好的,我明白了我的困惑。我需要在对 persp3D 的调用中添加“persp3D(x = x, y = y, z = -z,...”。我猜该函数在 x 和 y 时假定 x = y = [0,1]被省略了,这就是为什么点在那里,而不是我在图中预期的位置。修复它之后,我注意到如果我添加线 points3D(3.6194503, 1.6067539, G2(c(3.6194503, 1.6067539)),col = "red", size = 30, pch = 19, add = T) ,这个点奇怪地离开了情节。点 (3.6194503, 1.6067539) 应该在中间的某个地方,但不是那样绘制的。
    • 除此之外,如果可能的话,我想指定将点绘制在 3D 图上方的等高线图上。有没有办法做到这一点?在 3D 图上,点在峰后消失。谢谢!
    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    相关资源
    最近更新 更多