web-dev-qa-db-fra.com

Tracer efficacement des centaines de millions de points en R

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: 

 A Clifford attractor

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. 

  • Existe-t-il un moyen plus rapide de tracer (et de sauvegarder) tous ces points?
  • Est-ce que R est juste un mauvais outil pour ce travail?
  • Quels outils utiliseriez-vous pour tracer des milliards de points, même si vous ne pouviez pas les intégrer tous à la RAM?
  • Comment aurait-on pu créer un tracé de très haute résolution de ce type (couleur + transparence) avec, disons, le logiciel et le matériel des années 1990?

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()
36
dcl

J'explore actuellement datashader ( http://www.datashader.org ). Si vous souhaitez travailler avec Python, cela pourrait constituer une solution élégante au problème. 

1
Florian

Geom_hex () du paquetage ggplo2 peut être une solution? https://ggplot2.tidyverse.org/reference/geom_hex.html

0
Sara