如何让 highcharter 使用 tidy dataframe 中的 colorIndex 编号

How do I make highcharter use colorIndex number from tidy dataframe

问题:我试图强制 highcharter 始终只为每个系列使用特定颜色。

示例: 让我们使用 hc_colors 调色板和 colorIndex。我有两张图表,一张 colorIndex 的编号为 2、3 和 5,另一张 colorIndex 的编号为 1、2 和 4。唯一常见的 colorIndex 数字是 2,并且我只希望这个指标在两个图表上共享相同的颜色。然而,结果是两个图表的颜色相同,甚至它们的指标数字也大不相同。

代码:我的例子问题可以通过运行以下代码实现:

library(dplyr)
library(highcharter)
library(viridisLite)

n <- 6
df <- data.frame(date = Sys.Date() - (n*10):1,
                    metric = rep(letters[1:n], 10),
                    index = rep((n+1):(n*2), 10),
                    value = runif((n*10), 0, 1))

highchart() %>% 
  hc_title(text = 'Views') %>% 
  hc_xAxis(type = "datetime") %>%
  hc_add_series(data = df,
                type = 'spline',
                hcaes(x = date, y = value, group = metric, colorIndex = index)) %>% 
  hc_colors(viridis(n*2))

结果是,即使 hc_colors 包含的颜色是数据集中系列的两倍,并且用作 colorIndex 的索引仅包含 后半部分 of hc_colors 谱,前半部分使用:as can be seen in the chart。 但是,如果我将最后一行更改为:

hc_colors(viridis(n*2)[(n+1):(n*2)])

所以它只强制使用 hc_colors 的第二次停止,图像看起来不同。 As can be seen in the chart. 如果 highcharter 使用各自的颜色,这是预期的结果。

我也尝试过手动将颜色设置为“#RRGGBB”值,但结果更出乎意料——标记颜色只改变了 和线条颜色保持默认值:chart。 最后一个图表可以通过将 color = rep(viridis(n), 10) 添加到 dataframe 来实现,而不是设置 colorIndex,在 hceas 中设置 color = color。从 highcharts documentation 看来,在标记的选项中设置 lineColor 可能会有所帮助,但我不确定我是否能够设置它,或者它是否没有改变任何东西。

我会在评论中询问详细信息,但我有一些代码想分享,所以我创建了一个答案。

我不知道 viridis 的具体工作原理。我发现,Highcharter 不是只为系列设置颜色,而是为点设置颜色。如果您在 Whosebug 上没有得到完整的答案,我建议您在这里联系 Highcharter 作者:https://github.com/jbkunst/highcharter/issues

我不知道你到底想实现什么,但你可以在 JavaScript 中使用 R JS("...") 函数和 chart.events.load 事件手动设置你的颜色

根据您想要实现的目标,您可以更改标记的颜色以适合系列颜色:

library(dplyr)
library(highcharter)
library(viridisLite)

n <- 6
df <- data.frame(date = Sys.Date() - (n*10):1,
                 metric = rep(letters[1:n], 10),
                 index = rep((n+1):(n*2), 10),
                 value = runif((n*10), 0, 1),
                 color = rep(viridis(n), 10))

highchart() %>% 
  hc_title(text = 'Views') %>% 
  hc_chart(events = list(load = JS("function () {
   this.series.forEach(function (series) {
    series.data.forEach(function (point) {
      point.update({
        color: series.color
      }, false);
    });
   });
   this.redraw();
  }"))) %>%
  hc_xAxis(type = "datetime") %>%
  hc_add_series(data = df,
                type = 'spline',
                hcaes(x = date, y = value, group = metric, color = color)) %>% 
  hc_colors(viridis(n*2))

或者您可以更改系列颜色以适合标记:

library(dplyr)
library(highcharter)
library(viridisLite)

n <- 6
df <- data.frame(date = Sys.Date() - (n*10):1,
                 metric = rep(letters[1:n], 10),
                 index = rep((n+1):(n*2), 10),
                 value = runif((n*10), 0, 1),
                 color = rep(viridis(n), 10))

highchart() %>% 
  hc_title(text = 'Views') %>% 
  hc_chart(events = list(load = JS("function () {
   this.series.forEach(function (series) {
    series.update({
      color: series.data[0].color
    }, false);
   });
   this.redraw();
  }"))) %>%
  hc_xAxis(type = "datetime") %>%
  hc_add_series(data = df,
                type = 'spline',
                hcaes(x = date, y = value, group = metric, color = color)) %>% 
  hc_colors(viridis(n*2))

希望对您有所帮助。随时分享您的想法,也许我会找到其他解决方案。