【问题标题】:Data exploration in R: display heatmap of large matrix, quickly?R中的数据探索:快速显示大矩阵的热图?
【发布时间】:2018-10-27 02:57:54
【问题描述】:

如何在 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 中可视化矩阵的快速方法?理想的解决方案需要一两行代码。

【问题讨论】:

  • 在我的机器上使用内置的image() 函数(只是image(rand.matrix))需要1.75 秒,image.plot() 似乎更慢。
  • @Marius image() 在我的机器上仍然需要 11.5 秒才能获得 1000x1000 矩阵,再加上几秒钟的时间才能实际显示该图。 useRaster=TRUE 将其加速到 5.4 秒。

标签: r matlab matrix visualization data-visualization


【解决方案1】:

使用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()

【讨论】:

  • useRaster=TRUE 大大加快了速度!我现在得到 1000x1000 的 0.2 秒和 3000x3000 的 1.9 秒。然而,这并没有考虑到整个时间,因为距离情节实际出现还有大约 5-10 秒。不过,比几分钟快得多。如果有另一个更快的解决方案,我会不回答这个问题。
  • 我不确定为什么情节实际出现的延迟如此之长 - 如果您直接输出到 png() 设备,您可能会发现这不是问题。跨度>
  • 如何直接输出到png() 设备?
  • 查看我的编辑,但我不能 100% 保证这会大大提高效率。
  • 保存到文件确实加快了速度,并消除了绘图出现在 Rstudio 中时的 5-10 秒延迟。 .png 几乎是立即制作的。
猜你喜欢
  • 2016-06-25
  • 2013-12-25
  • 2017-02-22
  • 2018-09-03
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
相关资源
最近更新 更多