2015-06-17 17 views
6

Si sta tentando di tracciare circa 4000 punti dati dalla colonna a1 come barre utilizzando i Grafici elevati. I colori delle barre a1 si basano sui valori di un'altra colonna denominata a3. Se a3 è negativo su una riga, la barra corrispondente a a1 dovrebbe essere rossa e a3 positiva dovrebbe dare colore verde.Diagrammi elevati troppo lenti quando si stampano 4000 barre (rCharts)

Il problema è che il grafico impiega circa 25 secondi per generare e ci vogliono solo 20 secondi per stampare il grafico. Qualcuno potrebbe aiutarci a risolvere il codice e renderlo più veloce? Abbiamo provato a disabilitare animazioni e ombre, ma questo non ha aiutato troppo. Ecco il codice:

fun <- function(){ 

     ## Generate a random data set with roughly 4,000 lines 
     df <- as.data.frame(cbind(x = seq(1:3900), 
           a1 = rnorm(3900, 1000000, 2000000), 
           a2 = abs(rnorm(3900, 1000000, 2000000)), 
           a3 = rnorm(3900, 20000, 30000), 
           a4 = rnorm(3900, 1000, 500), 
           a5 = rnorm(3900, 0.01, 0.02))) 

     ## Modify the data set to assign colors to each bar based on the values 
     ## of a3. Green bars signify positive a3's and red bars signify 
     ## negative a3's 
     df <- df %>% 
      mutate(a6 = cumsum(a3)) %>% 
      mutate(color = ifelse(a3 > 0, 
            "rgba(50,205,50,0.6)", 
            "rgba(223,83,83,0.6)")) %>% 
      mutate(y = a1, 
        a1 = comma_format()(round(a1, 0)), 
        a3 = comma_format()(round(a3, 0)), 
        a4 = comma_format()(round(a4, 4)), 
        a5 = comma_format()(round(a5, 0)), 
        a6 = comma_format()(round(a6, 0)) 
      ) 

     ## Store the data in a list so that it is readable by Highcharts 
     input <- list() 
     input <- lapply(unname(split(df, seq(nrow(df)))), as.list) 

     ## Draw the graph with Highcharts 
     a <- rCharts::Highcharts$new() 
     a$series(data = input, 
       name = "a1 values", 
       type = "column") 
     a$plotOptions(series = list(turboThreshold = 4000)) 
     a$chart(zoomType = "xy", animation = FALSE) 
     a$addParams(width = 1000, height = 400, title = list(text = "The Slow Chart")) 
     a$tooltip(formatter = "#! function() 
      {return 'Date:<b> ' + this.point.x + 
         '</b> <br/>a1 values:<b> ' + this.point.a1 + 
       '</b> <br/>a3 values:<b> ' + this.point.a2 + 
       '</b> <br/>a4 values:<b> ' + this.point.a3 + 
       '</b> <br/>a5 values:<b> ' + this.point.a5 + 
       '</b> <br/>a6 values:<b> ' + this.point.a6} !#") 
     print(a) 
} 

Qualsiasi aiuto è apprezzato!

+1

non è 4000of barre grafiche per un po 'troppo? Voglio dire se non avrai larghezza = 4000px, allora non sarai in grado di visualizzare tutte quelle colonne. Ad esempio, utilizzando il grafico 500x500, richiederebbe il rendering di 4 colonne in un pixel;) In ogni caso, considerare l'utilizzo di Highstock con la funzione [dataGrouping] (http://api.highcharts.com/highstock#plotOptions.series.dataGrouping). –

+0

Grazie per i suggerimenti! Forse dovrei provare Highstock e vedere se è in grado di risolvere il problema. L'unica cosa che mi sto ancora chiedendo è che non dovrebbe essere così lento tracciare 4000 battute perché le persone possono effettivamente usare Highcharts per tracciare 1,7 milioni di punti dati, come mostrato nella galleria Highcharts, e perché alcuni videogiochi potrebbero fare qualcosa di più complicato di quello in circa un secondo. Cercherò Highstocks domani, ma sono curioso di sapere se ho definito qualcosa in modo negativo. –

+1

È 1,7 milioni di punti in ** Highstock **, non Highcharts :) In Highstock, puoi tracciare molti punti usando 'dataGrouping' (nessun limite, ma circa 100 000 dovrebbero essere lisci). Oppure utilizzare il caricamento asincrono dei dati per caricare ancora più punti, come ad esempio in 1,7 milioni di punti. –

risposta

0

Prima di tutto, mostra quali pacchetti stai usando nel tuo codice (dplyr, scale).

C'è un boost module per i grafici elevati. purtroppo rCharts non include quel modulo per impostazione predefinita, quindi è necessario aggiungere manualmente.

D'altra mano. C'è un nuovo wrapper per i grafici highcharts chiamato highcharter che ha un'implementazione di questo modulo. Usandolo non ci vuole più di 1 secondo per tracciare le 3900 colonne.

highchart2() %>% 
    hc_title(text = "Not so slow chart ;)") %>% 
    hc_subtitle(text = "Thanks boost module") %>% 
    hc_chart(zoomType = "x", animation = FALSE, type = "column") %>% 
    hc_plotOptions(series = list(turboThreshold = 4000)) %>% 
    hc_add_serie(data = input) 

Controllare la velocità/qui:

http://rpubs.com/jbkunst/highcharts-too-slow-when-plotting-4000-bars-rcharts

+0

Un lavoro fantastico e straordinario! Vorrei nominarti per il premio Nobel! – PaeneInsula

+0

@PaeneInsula Hahay per quel complimento. Ma questo è solo un highcharts, sono solo un wrapperman;) – jbkunst

Problemi correlati