Highcharter:将字符串变量添加到工具提示中

时间:2019-01-07 11:51:22

标签: javascript r highcharts

一段时间以来,我一直在与一个特定的问题作斗争,而Stackoverflow上现有的(非常相似的)答案都无法让我到达需要的位置。

我只是想将字符串变量作为其他数据添加到高图散点图中的工具提示中。我想要的东西与此问题类似:Additional data to highcharter tooltip

我已经对该问题的代码进行了一些修改,以创建一个可行的示例。问题是我似乎无法在工具提示中显示字符串变量(如果它们是因素,则将其解析为数字)。

library("dplyr")
library("highcharter")

data<- data.frame(Company = c("A", "A", "A", "B", "B", "B"),
              Country = as.vector(c("A", "D", "F", "B", "B", "B")),
              Year = c(1,2,3,1,2,3),
              Value1 = c(100, 150, 170, 160, 150, 180),
              Value2 = c("hi", 1, 7, 6, 5, 4), stringsAsFactors = FALSE)


data<- data %>%
 group_by(name = Company) %>%
 do(data = .$Value1, Value2 = .$Value2, Country = .$Country)

series<- list_parse(data)


highchart()%>%
  hc_chart(type="scatter")%>%
  hc_add_series_list(series)%>%
  hc_tooltip(formatter= JS("function () { return 'Company: ' + 
  this.series.name  + ' <br /> Value1: ' + this.point.y +
                   '<br /> Country: ' + this.point.Country ;}"))

当我尝试添加“ this.point.Country”时,这只是产生未定义的工具提示。

我还发现了这一点:R Highcharter: tooltip customization

建议将工具提示定制作为系列的一部分。但是,当我这样做时,当我将字符串变量传递给系列时,绘图似乎完全失败。例如,这有效,并且还允许我将z变量传递到工具提示中:

Errors <- data.frame(Average_R = c(90,100,110,131),
                 Minimum_R = c(50, 30, 45, 65),
                 Plant_name = c("Place","holder","name","here"), 
          stringsAsFactors = F)

highchart() %>% 
  hc_plotOptions(scatter = list(
  dataLabels = list(enabled = F),
  enableMouseTracking = TRUE
       )
    ) %>% 
hc_series(
     list(type = "scatter",
          name = pollutant,
          data = Map(c,y = round(Errors$Average_R,2), z = Errors$Minimum_R))
     ) %>%
hc_tooltip(formatter = JS(paste0('function() {
                               return "<span style=\'color:" + this.point.color + "\'>\u25CF</span> " + this.series.name + " : <b>" + this.point.y + "</b> " + this.point.z + "<br/>";
    }'))) 

结果(没有足够的代表来发布直接图像)

enter image description here

但是当我将hc_series的data参数中的z变量更改为字符串变量Plant_name时,整个绘图都会失败。

有人对如何解决这个问题有想法吗?

1 个答案:

答案 0 :(得分:0)

根据Set Additional Data to highcharts seriesNick的回答,这实际上是数据表示的问题,请看一下他在https://jsfiddle.net/burwelldesigns/jeoL5y7s/的小提琴

基本上,该系列应该是一个嵌套列表,您要使用的所有内容都应位于data

之内

您可能想找到一种更有效的方式来定义系列,但最终应该是这样的:

df <- data_frame(name = c('A', 'B'))
df$data <- list(
  list(
    list(y = 100, Country = "A"), 
    list(y = 150, Country = "D"),
    list(y = 170, Country = "F")), 
  list(
    list(y = 160, Country = "B"),
    list(y = 150, Country = "B"),
    list(y = 180, Country = "B")))

series <- list_parse(df)

然后输入您的高级图表代码

highchart()%>%
  hc_chart(type="scatter")%>%
  hc_add_series_list(series)%>%
  hc_tooltip(formatter= JS("function () { return 'Company: ' + 
  this.series.name  + ' <br /> Value1: ' + this.point.y +
                   '<br /> Country: ' + this.point.Country ;}"))

这是它的外观 enter image description here

更新:用户可以使用lapply来获取所需的嵌套列表,例如以下适用于数据的内容:

请注意:

  • 我使用data_0而不是data来避免混乱

  • 我将列Value1的名称更改为y,以使highchart正常工作

  • 如果需要,您还可以定义x列(尝试取消注释我在示例中添加的x列)

data_0 <- data.frame(Company = c("A", "A", "A", "B", "B", "B"),
                     Country = as.vector(c("A", "D", "F", "B", "B", "B")),
                     Year = c(1,2,3,1,2,3),
                     y = c(100, 150, 170, 160, 150, 180),
                    # x = c(0, 1, 7, 6, 5, 4),
                     Value2 = c('hi', 1, 7, 6, 5, 4), stringsAsFactors = FALSE)

# use the unique group values as names for the lists
df <- data_frame(name = unique(data_0$Company))

# use nested lapplys to get nested lists
df$data <- lapply(df$name,                                    # for each group name
                  function(x, data_orig, cols){
                    temp_df <- data_orig[data_orig$Company==x, cols]      # get the data that belongs to this group
                    lapply(1:nrow(temp_df), 
                           function(i){
                             as.list(temp_df[i,])}               # make it a list
                           )}, 
                  data_orig = data_0, cols = c(2:5))            

series <- list_parse(df)