Как я могу сделать тепловую карту с большой матрицей? - PullRequest
10 голосов
/ 14 апреля 2011

У меня есть матрица 1000 * 1000 (которая включает только целые числа 0 и 1), но когда я попытался создать тепловую карту, произошла ошибка, потому что она слишком велика.

Как создать тепловую картус такой большой матрицей?

Ответы [ 6 ]

13 голосов
/ 14 апреля 2011

Я могу поверить, что тепловая карта, по крайней мере, занимает много времени, потому что 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))

Возможно, вы захотите рассмотреть то, что вы действительно хотите, из тепловой карты - то есть, вам нужны причудливые дендрограммы / переупорядочение?

11 голосов
/ 14 апреля 2011

В этом вопросе есть совет об управлении памятью R. Если вы не можете выделить изображение 1000 на 1000, вам, вероятно, следует прекратить попытки делать статистику на вашем мобильном телефоне.

8 голосов
/ 14 апреля 2011

Нет ошибок, когда я пытаюсь это сделать. Вот код:

 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

5 голосов
/ 14 апреля 2011

попробуйте пакет растр , он может обрабатывать огромный растровый файл.

2 голосов
/ 20 августа 2015

Для меня

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 для этого для больших матриц. С очень большими матрицами вы неизбежно столкнетесь с проблемами, пытаясь создать иерархический кластер на основе расстояния. В этом случае вы все равно можете использовать аргументы 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 ГБ памяти, тогда как с включенными дендрограммами он уже начинает работать.

1 голос
/ 29 ноября 2013

Вы также можете использовать heatmap.2 из пакета gplots и просто отключить дендрограммы, поскольку они обычно занимают больше всего времени вычислений (из моего опыта).

Кроме того, рассматривали ли вы возможность прямой печати вашей тепловой карты в файл с помощью pdf (), png () или jpeg ()?

...