[英]How to 3D plot matrices that are not squared in R?
我想使用自己的数学函数而不是内核密度估计来绘制热图。 但是目前,我的问题来自以下事实:如果我的x
和y
轴未平方,则无法使用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
我根据图像尺寸创建两个向量(即e1
和e2
)。 因此, e1
长855个单元, e2
长670个单元。 然后,我使用上面的函数来创建图像大小相同(即855 x 670)的两个矩阵(即E1
和E2
)。
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.