r कुशलतापूर्वक आर में करोड़ों अंकों की साजिश रचने




plot graphics (2)

क्या plot() आर में 100 मिलियन या तो डेटा बिंदुओं पर प्लॉट करने का सबसे कुशल तरीका है? मैं इन क्लिफोर्ड आकर्षण का एक गुच्छा साजिश करना चाहूंगा। यहाँ एक उदाहरण दिया गया है जिसे मैंने बहुत बड़ी छवि से हटा दिया है:

Here कुछ कोड का लिंक दिया गया है जिसका उपयोग मैंने बहुत बड़ी 8K (7680x4320) छवियों को बनाने के लिए किया है।

50 या 100 मिलियन पॉइंट (Rcpp का उपयोग करके) उत्पन्न करने में लंबा समय नहीं लगता है, न ही रंग + पारदर्शिता के लिए हेक्स मान प्राप्त करने के लिए, लेकिन डिस्क पर वास्तविक प्लॉटिंग और सेविंग बेहद धीमी है।

  • क्या इन सभी बिंदुओं पर साजिश करने (और बचाने) का तेज़ तरीका है?
  • क्या R सिर्फ इस काम का एक बुरा साधन है?
  • यदि आप उन सभी को राम में फिट नहीं कर सकते हैं, तो आप अरबों बिंदुओं का उपयोग करने के लिए किन उपकरणों का उपयोग करेंगे?
  • किसी ने 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()

मैं वर्तमान में डेटाशेयर ( http://www.datashader.org ) की खोज कर रहा हूं। यदि आप अजगर के साथ काम करने के लिए तैयार हैं, तो यह समस्या का एक सुंदर समाधान हो सकता है।






strange-attractor