plot()
est-il le moyen le plus efficace de tracer environ 100 millions de points de données dans R? J'aimerais tracer un tas de ces Clifford Attractors . Voici un exemple d'image que j'ai réduite d'une très grande image:
Ici est un lien vers un code que j'ai utilisé pour tracer de très grandes images 8K (7680x4320).
Il ne faut pas longtemps pour générer 50 ou 100 millions de points (avec Rcpp), ni pour obtenir la valeur hexadécimale de la couleur + transparence, mais le traçage et l’enregistrement sur disque sont extrêmement lents.
Edit: code utilisé
# 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()
J'explore actuellement datashader ( http://www.datashader.org ). Si vous souhaitez travailler avec Python, cela pourrait constituer une solution élégante au problème.
Geom_hex () du paquetage ggplo2 peut être une solution? https://ggplot2.tidyverse.org/reference/geom_hex.html