如何制作带有大矩阵的热图?

时间:2011-04-14 17:22:35

标签: r heatmap

我有一个1000 * 1000矩阵(只包含整数0和1),但是当我尝试制作热图时,会发生错误,因为它太大了。

如何创建具有如此大矩阵的热图?

6 个答案:

答案 0 :(得分:13)

我可以相信热图至少需要很长时间,因为heatmap做了很多花哨的东西,需要额外的时间和记忆。使用@ bill_080示例中的dat

## 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))

您可能想要考虑热像图中您真正想要的东西 - 即,您是否需要花哨的树形图/重新排序的东西?

答案 1 :(得分:11)

this SO question中有关R内存管理的建议。如果您无法分配1000 x 1000图像,那么您可能应该停止尝试在手机上执行统计信息。

答案 2 :(得分:8)

尝试时没有错误。这是代码:

 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))

enter image description here

答案 3 :(得分:5)

尝试光栅包,它可以处理巨大的光栅文件。

答案 4 :(得分:2)

对我来说

library(heatmap3)
nrowcol <- 1000
dat <- matrix(ifelse(runif(nrowcol*nrowcol) > 0.5, 1, 0), nrow=nrowcol)
heatmap3(dat,useRaster=TRUE)

enter image description here

工作正常。 useRaster=TRUE对于将内存使用限制在一定范围内似乎非常重要。您可以在heatmap.2中使用相同的参数。计算层次聚类的距离矩阵是计算中的主要开销,但heatmap3使用更高效的fastcluster包用于大型矩阵。 With very large matrices you will unavoidably get into trouble though trying to do a distance-based hierarchical cluster.在这种情况下,您仍然可以使用参数Rowv=NAColv=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内存时,

仍然可以正常运行,而包含树形图时,它已经开始嘎吱作响。

答案 5 :(得分:1)

您也可以使用gplots包中的heatmap.2,只需关闭树形图,因为这些通常占用最多的计算时间(根据我的经验)。

另外,您是否考虑过通过pdf(),png()或jpeg()直接将热图打印到文件中?