2011-04-14 19 views
9

Tengo una matriz 1000 * 1000 (que solo incluye el número entero 0 y 1), pero cuando traté de hacer un mapa de calor, se produce un error porque es demasiado grande.¿Cómo puedo hacer un mapa de calor con una matriz grande?

¿Cómo puedo crear un mapa de calor con una matriz tan grande?

+0

Muchas respuestas sobre heatmap. http://stackoverflow.com/questions/3789549/display-a-matrix-including-the-values-as-a-heatmap http://stackoverflow.com/questions/5035491/how-to-put-black-borders -in-heatmap-in-r Intenta buscar '[r] heatmap'. –

+0

Por favor, copie y pegue el error exacto. 1000x1000 no debe producir una matriz de distancia demasiado grande para R. – Vince

+0

@Roman, pero esta no es ninguna de esas preguntas ... – Vince

Respuesta

11

Hay consejos en this SO question sobre la gestión de memoria R. Si no puede asignar una imagen de 1000 por 1000, probablemente debería dejar de intentar hacer estadísticas en su teléfono móvil.

+5

¿puedo obtener R backported para mi palmpilot? –

+2

enviado desde mi iPhone – mdsumner

+2

La tara principal no está trazando la imagen sino haciendo el análisis de clúster jerárquico, ya que eso requiere calcular una matriz de distancia por pares, y esto es notoriamente difícil de escalar a problemas más grandes ... e incluso solo trazar el uso de la memoria de imagen es inusualmente alto: una matriz de niveles de una matriz de 5000 x 5000 consume hasta 6 Gb de memoria; esto se resuelve usando el argumento useRaster = TRUE en heatmap.2 o heatmap3 aunque .... No estoy seguro de lo que está pasando en la función de mapa de calor estándar allí ... –

8

No hay errores cuando lo intento. Aquí está el código:

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

+0

Pude llegar a una parcela de aproximadamente 2300X2300. Un diagrama 2400X2400 dio "Error al usar el paquete 1 no puede asignar un vector de tamaño 22.0 Mb" en la declaración levelplot(). –

+0

Para mí esto solo funcionó para matrices más grandes con la opción useRaster = TRUE, es decir, levelplot (dat, main = "1000 X 1000 Levelplot", xlab = "", ylab = "", col.regions = pal (4), cuts = 3, at = seq (0,1,0.5), useRaster = TRUE); de lo contrario, incluso con una matriz de 5000 x 5000 terminaría asignando alrededor de 6 Gb de memoria, ¡no es bueno! –

+0

Además, este es un diagrama de nivel, no un mapa de calor con clústeres jerárquicos de filas y/o columnas incluidos, lo que hace una gran diferencia ... –

5

tratar la trama paquete , puede manejar gran archivo de mapa de bits.

13

Puedo creer que el mapa de calor está, por lo menos, tomando mucho tiempo, porque heatmap hace muchas cosas extravagantes que requieren más tiempo y memoria. Usando dat del ejemplo de @ 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)) 

Es posible que desee considerar lo que realmente quiere salir del mapa de calor - es decir, ¿necesita el dendrograma de fantasía/reordenar cosas?

1

También puede usar heatmap.2 del paquete gplots y simplemente desactivar los dendrogramas, ya que estos normalmente ocupan la mayor parte del tiempo de cómputo (según mi experiencia).

Además, ¿ha considerado directamente la impresión de su mapa de calor en un archivo a través de pdf(), png() o jpeg()?

2

Para mí

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

enter image description here

funciona bien. El useRaster=TRUE parece bastante importante para mantener el uso de la memoria dentro de ciertos límites. Puede usar el mismo argumento en heatmap.2. El cálculo de la matriz de distancia para la agrupación jerárquica es la carga general principal en el cálculo, pero heatmap3 usa el paquete más eficiente fastcluster para las matrices grandes. With very large matrices you will unavoidably get into trouble though trying to do a distance-based hierarchical cluster. En ese caso, puede seguir utilizando los argumentos Rowv=NA y Colv=NA para suprimir los dendrogramas de filas y columnas y usar alguna otra lógica para ordenar sus filas y columnas, p. Ej.

nrowcol <- 5000 
dat <- matrix(ifelse(runif(nrowcol*nrowcol) > 0.5, 1, 0), nrow=nrowcol) 
heatmap3(dat,useRaster=TRUE,Rowv=NA,Colv=NA) 

todavía funciona sin problemas en mi ordenador portátil con 8 Gb de memoria, mientras que con los dendrogramas incluyen ya empieza a crujir.

Cuestiones relacionadas