如何绘制 R 中未平方的 3D 绘图矩阵?
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 个单元格。然后我使用上面的函数来创建两个矩阵(即 E1
和 E2
)与图像大小相同(即 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)
我想使用我自己的数学函数而不是核密度估计来绘制热图。但目前我的问题是,如果我的 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 个单元格。然后我使用上面的函数来创建两个矩阵(即 E1
和 E2
)与图像大小相同(即 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)