繁体   English   中英

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

[英]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个单元。 然后,我使用上面的函数来创建图像大小相同(即855 x 670)的两个矩阵(即E1E2 )。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM