【发布时间】:2018-10-19 09:26:28
【问题描述】:
我正在尝试在 R 中绘制一个使用 ggplot 生成的大型热图。最终,我想使用 Illustrator 来“润色”这个热图。
示例代码:
# Load packages (tidyverse)
library(tidyverse)
# Create dataframe
df <- expand.grid(x = seq(1,100000), y = seq(1,100000))
# add variable: performance
set.seed(123)
df$z <- rnorm(nrow(df))
ggplot(data = df, aes(x = x, y = y)) +
geom_raster(aes(fill = z))
虽然我将绘图保存为矢量图像(.pdf;不是那么大),但打开时 pdf 的加载速度非常慢。我希望在打开文件时呈现数据框中的每个单独的点。
我已阅读其他使用image() 可视化矩阵的帖子(例如Data exploration in R: display heatmap of large matrix, quickly?),但是我想使用 ggplot 来修改图像。
问题:如何加快这个情节的渲染速度?有没有办法(除了降低绘图的分辨率),同时保持图像矢量化,加快这个过程?是否可以对矢量化 ggplot 进行下采样?
【问题讨论】:
-
尝试改用
geom_raster()。要求grid图形子系统生成那么多矩形对象不会有好的结果。另外:ggplo2 在渲染之前会复制所有数据,因此这也会占用大量内存,直到 ggplot2 对象消失。image()很可能是更好的方法或非 ggplot2 空间栅格绘图功能之一。 -
由于有这么多点,您实际上无法理解单个点,您可以分箱(方形箱或十六进制箱)并绘制热图。对于要在绘图中突出显示的异常点,请根据 bin 中的点数进行过滤。例如,如果一个 bin 只有 1 个点,只需绘制点而不是 bin。
-
我注意到在最近的一次编辑中,您将
expand.grid从 1e5x1e5 更改为 1e6x1e6。这现在会引发cannot allocate vector of size 3725.3 Gb错误。建议回滚此编辑,因为几乎没有人拥有这么大的计算机。事实上,1e4x1e4 已经在突破界限。 -
您的热图是 1M 行 x 1M 列,或 1 万亿像素。在 300 dpi 时,您需要一个 277 英尺宽的显示器来显示它。我想你的屏幕或页面比那个小? ;-)