2015-06-17 9 views
6

Próbujemy wykreślić około 4000 punktów danych z kolumny a1 jako słupków przy użyciu Highcharts. Kolory pasków a1 są oparte na wartościach innej kolumny o nazwie a3. Jeśli a3 jest ujemne w jednym wierszu, odpowiedni pasek wokół a1 powinien być czerwony, a pozytywny a3 powinien dać kolor zielony.Highcharts zbyt wolno podczas kreślenia 4000 barów (rCharts)

Problem polega na tym, że wygenerowanie wykresu zajmuje około 25 sekund, a wydrukowanie wykresu zajmuje tylko 20 sekund. Czy ktoś mógłby nam pomóc naprawić kod i przyspieszyć działanie? Próbowaliśmy wyłączyć animacje i cienie, ale to nie pomogło zbytnio. Oto kod:

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) 
} 

Każda pomoc jest doceniana!

+1

nie Czy 4000of barów na wykresie trochę za dużo? Chodzi mi o to, że jeśli nie będziesz miał szerokości = 4000px, nie będziesz w stanie wyświetlić wszystkich tych kolumn. Na przykład przy użyciu wykresu 500 x 500 wymagałoby to renderowania 4 kolumn w jednym pikselu;) W każdym razie rozważ użycie funkcji Highstock z funkcją [dataGrouping] (http://api.highcharts.com/highstock#plotOptions.series.dataGrouping). –

+0

Dzięki za sugestie! Może powinienem spróbować Highstock i sprawdzić, czy to rozwiąże problem. Jedyne, nad czym wciąż zastanawiam się, to to, że nie powinno być tak powolne, by wystawić 4000 barów, ponieważ ludzie mogą rzeczywiście używać Highcharts do kreślenia 1.7 milionów punktów danych, jak pokazano w galerii Highcharts, i ponieważ niektóre gry wideo mogą zrobić coś bardziej skomplikowanego niż za około sekundę. Mam zamiar spróbować jutro Highstocks, ale jestem ciekawy, czy zdefiniowałem coś w zły sposób. –

+1

To 1,7 miliona punktów w ** Highstock **, nie Highcharts :) W Highstock, możesz spiskować wiele punktów używając 'dataGrouping' (bez limitu, ale około 100 000 powinno być gładkich). Lub użyj asynchronicznego ładowania danych, aby załadować jeszcze więcej punktów, jak na przykład w 1.7million punktów. –

Odpowiedz

0

Przede wszystkim proszę pokazać, jakie pakiety używasz w swoim kodzie (dplyr, scale).

Dla highchartów jest boost module. Niestety rCharts nie zawierają tego modułu domyślnie, więc musisz dodać ręcznie.

Z drugiej strony. Jest nowy wrapper dla highchartów o nazwie highcharter, które mają implementację tego modułu. Korzystanie z niego nie zajmuje więcej niż 1 sekundę, aby sporządzić wykres 3900 kolumn.

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) 

Sprawdź prędkość/tutaj:

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

+0

Wspaniała, niesamowita robota! Chciałbym nominować cię do Nagrody Nobla! – PaeneInsula

+0

@PaeneInsula Haha ty za ten komplement. Ale to tylko highcharts, jestem tylko wrapperman;) – jbkunst

Powiązane problemy