Исследование данных в R: быстро отобразить тепловую карту большой матрицы? - PullRequest
0 голосов
/ 17 мая 2018

Как быстро визуализировать большие матрицы в R?

Я иногда работаю с числовыми матрицами большого размера (например, 3000 x 3000), и быстрая их визуализация является очень полезным качествомконтрольный шаг.Это было очень легко и быстро в Matlab, моем предыдущем выбранном языке.Например, для отображения матрицы 1000x1000 требуется 0,5 секунды:

rand_matrix = rand(1000,1000);
tic
imagesc(rand_matrix)
toc
>> Elapsed time is 0.463903 seconds.

Я хотел бы иметь такие же мощности в R, но, к сожалению, визуализация матриц кажется очень медленной в R .Например, при использовании image.plot() та же самая случайная матрица отображается более 10 секунд:

require(tictoc)
require(image.plot)
mm = 1000
nn = 1000
rand.matrix = matrix(runif(mm*nn), ncol=mm, nrow=nn)
tic("Visualizing matrix")
image.plot(rand.matrix)
toc()
> Visualizing matrix: 11.744 sec elapsed

Проблема усугубляется по мере увеличения матриц.Например, матрица 3000x3000 требует минут для визуализации в R, по сравнению с секундами в Matlab.Это явно не работает для исследования данных.Я попробовал ggplot, и melting + geom_raster () все еще может занять до минуты.

Что я делаю не так?Есть ли быстрый способ визуализации матриц в R? Идеальное решение заняло бы одну или две строки.

1 Ответ

0 голосов
/ 17 мая 2018

Я получаю график довольно быстро при использовании image(m, useRaster = TRUE):

start = Sys.time()
image(rand.matrix, useRaster = TRUE)
print(Sys.time() - start)
# Time difference of 0.326 secs

Без useRaster = TRUE это занимает 1,5 секунды, useRaster ускоряет это, но работает только для простых, равномерно распределенных точек. Я думаю,.

Если ваша конечная цель состоит в том, чтобы создать файл изображения с этим графиком, то я думаю, что наиболее эффективным может быть вывод непосредственно в растровый формат, такой как png, хотя немного сложно измерить, как долго Rпринимает для сохранения файла изображения, например:

png("image_plot.png", width = 1000, height = 1000)
image(rand.matrix, useRaster = TRUE)
dev.off()
...