如何绘制 R 中未平方的 3D 绘图矩阵?

How to 3D plot matrices that are not squared in R?

我想使用我自己的数学函数而不是核密度估计来绘制热图。但目前我的问题是,如果我的 xy 轴不是平方的,我无法使用 persp() 3D 绘制此函数。实际上,热图的大小为 855 x 670。

1)有没有办法解决这个问题?

2) 另外,有谁知道如何把它变成热图吗?

提前致谢。请在下面找到我的脚本的一部分。

–––––––––––––––––––––––––––––––––––––––– ––––––––––––––––––––––––––––––

这是我们需要的两个函数:

rep.row <- function(x, n){
  matrix(rep(x, each = n), nrow = n)
}
rep.col <- function(x, n){
  matrix(rep(x, each = n), ncol = n, byrow = TRUE)
}

这会读取图像并提取其尺寸(即宽度和长度):

require('png')
png <- readPNG("myImage.png")
res <- dim(png)[2:1]

参考资料:

> dim(png)[2:1]
[1] 855 670

这些是固定参数:

alphaW <- 53
alphaH <- 31
a <- 2.3

我根据图像尺寸创建了两个向量(即 e1e2)。因此,e1 的长度为 855 个单元格,而 e2 的长度为 670 个单元格。然后我使用上面的函数来创建两个矩阵(即 E1E2)与图像大小相同(即 855 x 670)。

e1 <- seq(-alphaW, alphaW, length = res[1])
e2 <- seq(-alphaH, alphaH, length = res[2])

E1 <- rep.row(e1, res[2])
E2 <- rep.col(e2, res[1])

这两个矩阵的计算用于创建第三个矩阵,SV:

SV <- sqrt((a / (a + ((E1^2) + (E2^2)))))

最后我想绘制这个矩阵的 3D 表示:

persp(x = e1, y = e2, z = SV,
      col = "lightgoldenrod",
      border = NA,
      theta = 30,
      phi = 15,
      ticktype = "detailed",
      ltheta = -120,
      shade = 0.25)

这应该输出类似{this}的内容,但是,我收到:

Error in persp.default(e1, e2, SV, col = "lightgoldenrod", border = NA,  :
argument 'z' incorrect

你调换了 x 和 y。如果查看 persp() 的帮助页面,您会注意到 x 的长度应为 nrow(z),y 的长度应为 ncol(z)。因此,尽管直觉上您可能希望行位于垂直轴上(矩阵的可视化方式),但似乎恰恰相反。

这个有效:

persp(y = e1, x = e2, z = SV,
      col = "lightgoldenrod",
      border = NA,
      theta = 30,
      phi = 15,
      ticktype = "detailed",
      ltheta = -120,
      shade = 0.25)