我有一个 1000*1000 的矩阵(仅包含整数 0 和 1),但是当我尝试制作热图时,由于它太大而出现错误。
如何创建具有如此大矩阵的热图?
我可以相信,热图至少需要很长时间,因为heatmap
做了很多花哨的东西需要额外的时间和内存。使用dat
@bill_080 的示例:
## basic command: 66 seconds
t0 <- system.time(heatmap(dat))
## don't reorder rows & columns: 43 seconds
t1 <- system.time(heatmap(dat,Rowv=NA))
## remove most fancy stuff (from ?heatmap): 14 seconds
t2 <- system.time( heatmap(dat, Rowv = NA, Colv = NA, scale="column",
main = "heatmap(*, NA, NA) ~= image(t(x))"))
## image only: 13 seconds
t3 <- system.time(image(dat))
## image using raster capability in R 2.13.0: 1.2 seconds
t4 <- system.time(image(dat,useRaster=TRUE))
您可能需要考虑您真正想要从热图中得到什么——即,您是否需要花哨的树状图/重新排序的东西?
这个 SO question中有关于 R 内存管理的建议。如果您无法分配 1000 x 1000 的图像,那么您可能应该停止尝试在手机上进行统计。
我尝试时没有错误。这是代码:
library(lattice)
#Build the data
nrowcol <- 1000
dat <- matrix(ifelse(runif(nrowcol*nrowcol) > 0.5, 1, 0), nrow=nrowcol)
#Build the palette and plot it
pal <- colorRampPalette(c("red", "yellow"), space = "rgb")
levelplot(dat, main="1000 X 1000 Levelplot", xlab="", ylab="", col.regions=pal(4), cuts=3, at=seq(0,1,0.5))
试试光栅包,它可以处理巨大的光栅文件。
Using heatmap3
,它比默认heatmap
函数更节省内存,并且通过它使用fastcluster
包来执行层次聚类对我来说工作得更快。添加参数useRaster=TRUE
也有帮助:
library(heatmap3)
nrowcol <- 1000
dat <- matrix(ifelse(runif(nrowcol*nrowcol) > 0.5, 1, 0), nrow=nrowcol)
heatmap3(dat,useRaster=TRUE)
将useRaster=TRUE
内存使用保持在限制范围内似乎非常重要。您可以在 中使用相同的参数heatmap.2
。计算层次聚类的距离矩阵是计算中的主要开销,但对于大型矩阵heatmap3
使用更有效的包。对于非常大的矩阵,尽管尝试进行基于距离的层次聚类,您将不可避免地遇到麻烦。在这种情况下,您仍然可以使用参数并抑制行和列树状图并使用其他一些逻辑对行和列进行排序,例如fastcluster
Rowv=NA
Colv=NA
nrowcol <- 5000
dat <- matrix(ifelse(runif(nrowcol*nrowcol) > 0.5, 1, 0), nrow=nrowcol)
heatmap3(dat,useRaster=TRUE,Rowv=NA,Colv=NA)
在具有 8 Gb 内存的笔记本电脑上仍然可以毫无问题地运行,而包含树状图的情况下,它已经开始崩溃了。
您还可以使用 gplots 包中的 heatmap.2 并简单地关闭树状图,因为这些通常占用最多的计算时间(根据我的经验)。
另外,您是否考虑过通过 pdf()、png() 或 jpeg() 将热图直接打印到文件中?