在R中高效绘制数百万个数据点

15

我正在尝试在R中绘制数百万个数据点。我目前正在使用ggplot2(但我可以考虑其他替代包)。问题在于图形需要太长时间来呈现(通常超过一分钟)。我正在寻找更快的方法--理想情况下是实时的。我会感激任何帮助--为了清晰起见,请将代码附加到问题上。

创建一个(随机)数据框,其中包含约500,000个数据点:

letters <- c("A", "B", "C", "D", "E", "F", "G")
myLetters <- sample(x = letters, size = 100000, replace = T)
direction <- c("x", "y", "z")
factor1 <- sample(x = direction, size = 100000, replace = T)
factor2 <- runif(100000, 0, 20)
factor3 <- runif(100000, 0, 100)
decile <- sample(x = 1:10, size = 100000, replace = T)


new.plot.df <- data.frame(letters = myLetters, factor1 = factor1, factor2 = factor2, 
                      factor3 = factor3, decile = decile)

现在,绘制数据:
color.plot <- ggplot(new.plot.df, aes(x = factor3, y = factor2, color = factor1)) +
geom_point(aes(alpha = factor2)) +
facet_grid(decile ~ letters)

在此输入图片描述

如何使渲染更快?


7
我脑海中首先想到的是从你正在绘制的完整数据中取一个子集。较少的点应该意味着更快的渲染时间。关键是要找出如何对数百万个点进行采样的方法。 - Tim Biegeleisen
2
你应该重新考虑一下绘图方案。可能有更好的方法来可视化你的数据。无论如何,这里有一个答案演示了如何对数据进行子集处理,以便只绘制具有足够不同坐标的点:https://dev59.com/f3LYa4cB1Zd3GeqPWlrs#16668596 - Roland
@KaranTibrewal 请查看Bob回答的http://stats.stackexchange.com/questions/117078/for-plotting-with-r-should-i-learn-ggplot2-or-ggvis。这基本上与我的速度经验相符。 - Severin Pappadeux
你可以查看bigvis包。请参见这里这里 - Henrik
2
使用 '.' 符号。但是你会失去一些可视化能力。 - Andy Barbour
显示剩余6条评论
2个回答

19

在R绘图中,有两个主要的速度问题源:

  1. 总体上来说,图形设备和后端
  2. 绘制过多复杂形状

可以使用适当的设备打开和后端选择命令更改图形后端-对我来说,这通常很有帮助:

options(bitmapType='cairo')  #set the drawing backend, this may speed up PNG rendering
x11(type='cairo')   #drawing to X11 window using cairo is the fastest interactive output for me

(在Windows上X11不可用并且在Rstudio中有点混乱,但那是另一回事)

绘制简单的形状可以帮助很多。ggplot默认使用pch=19pch=20的某种变体,由于反锯齿而过慢。通过使用pch='.'(只是一个单独的非反锯齿像素)或pch=16(一个小的非反锯齿圆形),通常可以获得大约10倍更快的渲染速度。对于ggplot中的shape='.'shape=16也适用。如果您有很多点并设置了适当的低alpha值,则会免费获得“反锯齿”。

对我来说,只需切换图形后端并设置不同的点形状即可将100万个点的绘制时间从约30分钟提高到几秒钟。500k数据点应该在一秒钟内呈现。

编辑(2020年1月):我最近制作了一个库,可以进一步加速这一过程:https://github.com/exaexa/scattermore


1
谢谢提供这个库!它帮了我很多忙。 - user3276768

3
通常我使用以下两种策略:
1)如评论所述,获取数据的合理描述性样本不会影响您的绘图,同时可以减少要渲染的点数。
2)我使用的一个技巧是创建对象时不显示绘图,而是将绘图保存为PNG图像。这实际上大大加快了进程,因为打开图像时它将是光栅图像而不是矢量图像。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接