Highcharter: добавить строковую переменную в подсказку - PullRequest
0 голосов
/ 07 января 2019

Я уже некоторое время борюсь с конкретной проблемой, и ни один из существующих (очень похожих) ответов по Stackoverflow не дает мне того, где я должен быть.

Я просто хочу добавить строковую переменную в качестве дополнительных данных к всплывающей подсказке на диаграмме рассеяния старших диаграмм. То, что я хочу, похоже на этот вопрос: Дополнительные данные к всплывающей подсказке

Я немного изменил код из этого вопроса, чтобы создать работающий пример. Проблема в том, что я не могу получить строковые переменные (которые анализируются как числа, если они являются факторами) для отображения во всплывающей подсказке.

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: настройка всплывающей подсказки

Который рекомендует выполнять настройку всплывающей подсказки как часть серии. Однако, когда я делаю это, кажется, что график полностью проваливается, когда я передаю строковую переменную в ряд. Например, это работает, а также позволяет мне передать переменную 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

Но когда я изменяю переменную z в ​​аргументе данных hc_series на строковую переменную Plant_name, весь график завершается неудачей.

У кого-нибудь есть идеи, как это исправить?

1 Ответ

0 голосов
/ 07 января 2019

Основываясь на ответе здесь Установить дополнительные данные для серии старших диаграмм по Ника , на самом деле это вопрос представления данных, взгляните на его скрипку здесь 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, чтобы старшая диаграмма работала

  • Вы также можете определить столбец 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...