加速大型数据集的plot()函数

时间:2012-06-08 08:49:46

标签: r plot

我正在使用plot()超过1百​​万个数据点而且结果非常慢。

有没有办法提高速度,包括编程和硬件解决方案(更多RAM,图形卡......)?

存储的数据在哪里?

5 个答案:

答案 0 :(得分:24)

一个hexbin图实际上显示了一些东西(不像@Roland在评论中提出的散点图,这可能只是一个巨大的,缓慢的,blob),并且在我的机器上花了大约3.5秒为你的例子:

set.seed(101)
a<-rnorm(1E7,1,1)
b<-rnorm(1E7,1,1)
library(hexbin)
system.time(plot(hexbin(a,b)))

enter image description here

答案 1 :(得分:11)

简单快捷的方法是设置pch='.'。表现如下所示

x=rnorm(10^6)
> system.time(plot(x))
  user  system elapsed 
  2.87   15.32   18.74 
> system.time(plot(x,pch=20))
  user  system elapsed 
  3.59   22.20   26.16 
> system.time(plot(x,pch='.'))
  user  system elapsed 
  1.78    2.26    4.06 

答案 2 :(得分:2)

你看过tabplot包吗?它专为大数据而设计 http://cran.r-project.org/web/packages/tabplot/我使用它比使用hexbin更快(甚至是用于过度绘图的默认向日葵图)

我也认为Hadley在DS的博客上写了一些内容,在http://blog.revolutionanalytics.com/2011/10/ggplot2-for-big-data.html

修改大数据的ggplot

“”“我正在和另一名学生岳虎一起工作,将我们的研究转变为一个强大的R包。”“”2011年10月21日

也许我们可以问哈德利更新的ggplot3是否准备就绪

答案 3 :(得分:1)

这个问题是在尚不存在用于从R运行Python命令的reticulate软件包的时候提出的。

现在可以调用高效matplotlib Python library来绘制大型数据集。

here中介绍了R中

matplotlib的设置。

使用matplotlib绘制100万个点大约需要1.5秒:

library(reticulate)
library(png)

mpl <- import("matplotlib")
mpl$use("Agg") # Stable non interactive back-end
plt <- import("matplotlib.pyplot")
mpl$rcParams['agg.path.chunksize'] = 0 # Disable error check on too many points

# generate points cloud
a <-rnorm(1E6,1,1)
b <-rnorm(1E6,1,1)

system.time({
  plt$figure()
  plt$plot(a,b,'.',markersize=1)
  # Save figure
  f <- tempfile(fileext='.png')
  plt$savefig(f)
  # Close figure
  plt$close(plt$gcf())
  # Show image
  img <- readPNG(f)
  grid::grid.raster(img)
  # Close temporary file
  unlink(f)
})

#>        User      System       Total 
#>        1.29        0.15        1.49

reprex package(v0.3.0)于2020-07-26创建

答案 4 :(得分:0)

这里没有提到,但是绘制高分辨率的光栅图像是另一个合理的选择(如果您真的想绘制一个巨大的斑点:-)。创建过程非常缓慢,但是生成的图像将具有合理的大小,并且可以快速打开。由于PNG compress the file based on similarity of neighboring pixels,随着分辨率变大,blob的外部(全白)和内部(全黑)不再占用更多的存储空间-您要做的只是渲染对象的边缘详细信息。

set.seed(101)
a<-rnorm(1E7,1,1)
b<-rnorm(1E7,1,1)
png("blob.png",width=1000,height=1000)
system.time(plot(a,b)) ## 170 seconds on an old Macbook Pro
dev.off()

生成的图像文件为123K,可以通过提高渲染大小(创建和打开文件)和文件大小的较小幅度来提高分辨率。

enter image description here