在 R 中高效地绘制数亿个点
Efficiently plotting hundreds of millions of points in R
plot()
是在 R 中绘制 1 亿左右数据点的最有效方法吗?
我想绘制其中的一堆 Clifford Attractors。这是我从非常大的图像缩小的示例:
Here 是我用来绘制非常大的 8K (7680x4320) 图像的一些代码的 link。
生成 50 或 1 亿个点(使用 Rcpp)并不需要很长时间,也不会得到颜色 + 透明度的十六进制值,但实际绘图和保存到磁盘是 非常 慢。
- 有没有更快的方法来绘制(并保存)所有这些点?
- 对于这项工作,R 只是一个糟糕的工具吗?
- 你会使用什么工具来绘制数十亿个点,即使你不能将它们全部放入 ram?
- 如何使用 1990 年代的软件和硬件制作这种类型的高分辨率图(颜色 + 透明度)?
编辑:使用的代码
# Load packages
library(Rcpp)
library(viridis)
# output parameters
output_width = 1920 * 4
output_height = 1080 * 4
N_points = 50e6
point_alpha = 0.05 #point transperancy
# Attractor parameters
params <- c(1.886,-2.357,-0.328, 0.918)
# C++ function to rapidly generate points
cliff_rcpp <- cppFunction(
"
NumericMatrix cliff(int nIter, double A, double B, double C, double D) {
NumericMatrix x(nIter, 2);
for (int i=1; i < nIter; ++i) {
x(i,0) = sin(A*x(i-1,1)) + C*cos(A*x(i-1,0));
x(i,1) = sin(B*x(i-1,0)) + D*cos(B*x(i-1,1));
}
return x;
}"
)
# Function for mapping a point to a colour
map2color <- function(x, pal, limits = NULL) {
if (is.null(limits))
limits = range(x)
pal[findInterval(x,
seq(limits[1], limits[2], length.out = length(pal) + 1),
all.inside = TRUE)]
}
# Obtain matrix of points
cliff_points <- cliff_rcpp(N_points, params[1], params[2], params[3], params[4])
# Calculate angle between successive points
cliff_angle <- atan2(
(cliff_points[, 1] - c(cliff_points[-1, 1], 0)),
(cliff_points[, 2] - c(cliff_points[-1, 2], 0))
)
# Obtain colours for points
available_cols <-
viridis(
1024,
alpha = point_alpha,
begin = 0,
end = 1,
direction = 1
)
cliff_cols <- map2color(
cliff_angle,
c(available_cols, rev(available_cols))
)
# Output image directly to disk
jpeg(
"clifford_attractor.jpg",
width = output_width,
height = output_height,
pointsize = 1,
bg = "black",
quality = 100
)
plot(
cliff_points[-1, ],
bg = "black",
pch = ".",
col = cliff_cols
)
dev.off()
也许来自 ggplo2 包的 geom_hex() 是一个解决方案?
https://ggplot2.tidyverse.org/reference/geom_hex.html
我目前正在探索 datashader (http://www.datashader.org)。如果您愿意与 python 一起工作,这可能是解决问题的一个优雅方法。
我最近发现了 R 的 Scattermore 包,它比 R 的标准绘图函数快一个数量级。 scattermoreplot()
用颜色和透明度绘制 100m 个点大约需要 2 分钟,而 plot()
大约需要半小时。
plot()
是在 R 中绘制 1 亿左右数据点的最有效方法吗?
我想绘制其中的一堆 Clifford Attractors。这是我从非常大的图像缩小的示例:
Here 是我用来绘制非常大的 8K (7680x4320) 图像的一些代码的 link。
生成 50 或 1 亿个点(使用 Rcpp)并不需要很长时间,也不会得到颜色 + 透明度的十六进制值,但实际绘图和保存到磁盘是 非常 慢。
- 有没有更快的方法来绘制(并保存)所有这些点?
- 对于这项工作,R 只是一个糟糕的工具吗?
- 你会使用什么工具来绘制数十亿个点,即使你不能将它们全部放入 ram?
- 如何使用 1990 年代的软件和硬件制作这种类型的高分辨率图(颜色 + 透明度)?
编辑:使用的代码
# Load packages
library(Rcpp)
library(viridis)
# output parameters
output_width = 1920 * 4
output_height = 1080 * 4
N_points = 50e6
point_alpha = 0.05 #point transperancy
# Attractor parameters
params <- c(1.886,-2.357,-0.328, 0.918)
# C++ function to rapidly generate points
cliff_rcpp <- cppFunction(
"
NumericMatrix cliff(int nIter, double A, double B, double C, double D) {
NumericMatrix x(nIter, 2);
for (int i=1; i < nIter; ++i) {
x(i,0) = sin(A*x(i-1,1)) + C*cos(A*x(i-1,0));
x(i,1) = sin(B*x(i-1,0)) + D*cos(B*x(i-1,1));
}
return x;
}"
)
# Function for mapping a point to a colour
map2color <- function(x, pal, limits = NULL) {
if (is.null(limits))
limits = range(x)
pal[findInterval(x,
seq(limits[1], limits[2], length.out = length(pal) + 1),
all.inside = TRUE)]
}
# Obtain matrix of points
cliff_points <- cliff_rcpp(N_points, params[1], params[2], params[3], params[4])
# Calculate angle between successive points
cliff_angle <- atan2(
(cliff_points[, 1] - c(cliff_points[-1, 1], 0)),
(cliff_points[, 2] - c(cliff_points[-1, 2], 0))
)
# Obtain colours for points
available_cols <-
viridis(
1024,
alpha = point_alpha,
begin = 0,
end = 1,
direction = 1
)
cliff_cols <- map2color(
cliff_angle,
c(available_cols, rev(available_cols))
)
# Output image directly to disk
jpeg(
"clifford_attractor.jpg",
width = output_width,
height = output_height,
pointsize = 1,
bg = "black",
quality = 100
)
plot(
cliff_points[-1, ],
bg = "black",
pch = ".",
col = cliff_cols
)
dev.off()
也许来自 ggplo2 包的 geom_hex() 是一个解决方案? https://ggplot2.tidyverse.org/reference/geom_hex.html
我目前正在探索 datashader (http://www.datashader.org)。如果您愿意与 python 一起工作,这可能是解决问题的一个优雅方法。
我最近发现了 R 的 Scattermore 包,它比 R 的标准绘图函数快一个数量级。 scattermoreplot()
用颜色和透明度绘制 100m 个点大约需要 2 分钟,而 plot()
大约需要半小时。