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!
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). –
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,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. –