我正在使用plot()
超过1百万个数据点而且结果非常慢。
有没有办法提高速度,包括编程和硬件解决方案(更多RAM,图形卡......)?
存储的数据在哪里?
答案 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)))
答案 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)
我也认为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来绘制大型数据集。
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,可以通过提高渲染大小(创建和打开文件)和文件大小的较小幅度来提高分辨率。