Highcharts在绘制4000个条形图时速度太慢(rCharts)

6
我们正在尝试使用Highcharts将大约4000个数据点从a1列绘制为条形图。 a1条的颜色基于另一列名为a3的值。如果某一行的a3为负,则a1对应的条应该是红色的,而正数a3应该是绿色的。
问题在于,生成图表需要大约25秒的时间,而仅打印图表需要20秒钟。请有人帮助我们修复代码并使其更快。我们尝试禁用动画和阴影,但效果不太明显。以下是代码:
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)
}

非常感谢您的帮助!


1
每个图表4000个条形图不是有点太多了吗?我的意思是,如果你的宽度不是4000像素,那么你就无法显示所有的列。例如,使用500x500的图表,需要在一个像素中呈现4列;)无论如何,考虑使用Highstock和dataGrouping功能。 - Paweł Fus
谢谢您的建议!也许我应该尝试一下Highstock,看看它是否能解决问题。我仍然想知道的唯一一件事是,绘制4000个条形图不应该那么慢,因为人们实际上可以使用Highcharts绘制170万个数据点,如Highcharts画廊所示,并且因为一些视频游戏可以在大约一秒钟内完成比这更复杂的操作。我明天会尝试Highstocks,但我只是好奇是否以错误的方式定义了某些内容。 - Ziqi Lu
1
这是在 Highstock 中的 170 万个点,而不是 Highcharts :) 在 Highstock 中,您可以使用 dataGrouping 绘制大量点(没有限制,但大约 100,000 个应该很平滑)。或者使用异步数据加载来加载更多点,就像在 170 万个点的示例中一样。 - Paweł Fus
谢谢Pawel!现在它的运行速度比以前快多了! :D - Ziqi Lu
1个回答

0
首先,请展示你在代码中使用了哪些包(dplyr,scales)。
对于highcharts,有一个boost module。不幸的是,rCharts默认情况下不包括该模块,因此您需要手动添加。
另一方面,有一个名为highcharter的新高级图表包装器,它具有此模块的实现。使用它不需要超过1秒钟即可绘制3900列的图表。
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)

检查速度/这里:

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


1
太棒了,惊人的工作!我想提名你获得诺贝尔奖! - PaeneInsula
@PaeneInsula 哈哈,谢谢你的夸奖。但这只是Highcharts,我只是一个包装工 ;) - jbkunst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接