создать таблицу R Highchart со спарклайном

1

Я пытаюсь использовать R, чтобы создать DataTable с искрографикой и использовать его для моей блестящей панели. Упрощенная тестовая информация:

#Create lists for test df
Employee_name <- c('Alice',"Alice", "Alice",  'Brian', "Brian", "Brian","Brian",'Carol', 'Carol', 'Dan', 'Dan','Dan', 'Dan','Dan','Dan', "Lily", "Lily", "Eric", "Eric")
Product_type <- c('A', "A", "A", "A", "L",'L',"L", "A", "L", "A", "A", "A",'L', "L", "L", "R", "A", "I", "I")
Project_status <- c("Closed", "Legacy","Active","Closed", "Active", "Dropped", "Closed","Closed","Closed","Closed","Active","Dropped","Active","Closed","Dropped", "Active", "Closed", "Active", "Closed")
Proj_count_byTypeStatus <- c(2,1,1,4,12,1,4,3,2,10,3,1,3,8,1,8,1, 2,1)

#Test Data Frame
test_df <- data.frame(Employee_name, Product_type, Project_status, Proj_count_byTypeStatus)

Как сделать df таким, как это (вместо java, использовать R-коды): https://www.highcharts.com/demo/sparkline

Более конкретно:

  1. Каждый человек занимает всего одну строку
  2. Product_Type распространяется на столбцы
  3. Project_Status, отмеченный цветом "fill"

Я использовал таблицу для создания ожидаемого графика, надеюсь, что это поможет лучше понять мой вопрос: Изображение 174551

Спасибо всем за помощь!

  • 0
    Любая подсказка будет оценена, вам не нужно завершать кодирование. Спасибо!!
Теги:
dt
highcharts
sparklines

2 ответа

2
Лучший ответ

наконец, выяснить, как это сделать.

Основная идея в этом случае заключается в следующем:

  1. Преобразуйте кадр данных, в котором каждая ячейка значения является списком, включающим все уровни Project_Status, заполняет пробел нулями.
  2. Распределите ячейку значений с помощью ключа Product_type.
  3. Конфигурация в DT ColumDef и fnCallback с использованием небольшого кода Java
  4. Нарисуйте таблицу.

Код, как показано ниже:

library(DT)
library(sparkline)
library(dplyr)
library(htmlwidgets)
library(reshape2)
library(data.table)

#df preparation

sparkline_df_2 <- test_df %>%
  mutate(Project_status = as.character((Project_status), labels=c('Active', 
'Closed', 'Dropped', 'Legacy'))) %>%  
  group_by(Employee_name, Product_type) %>% 
  mutate(Prod_total= sum(Proj_count_byTypeStatus)) %>%
  complete(Project_status = c('Active', 'Closed', 'Dropped', 'Legacy'), fill = list(Proj_count_byTypeStatus = 0)) %>%
  as.data.frame() %>%
  group_by(Employee_name, Product_type) %>%
  summarize(Project_status = paste0(Proj_count_byTypeStatus, collapse = ",")) 

sparkline_df2_spread <- dcast(sparkline_df_2, Employee_name ~ Product_type)

#DT configuration

colDefs <- list(list(className = 'dt-center',targets = c(1:4), render = JS("function(data, type, full){ return '<span class=spark>' + data + '</span>' }")))

bar_string <- "type: 'bar', colorMap: ['#27AE60', '#48C9B0', '#C39BD3', '#F4D03F'], width: 50, height: 25, barWidth: 20, barSpacing:5, highlightColor: 'orange', tooltipFormat: '{{offset:levels}} : {{value}}', tooltipValueLookups: { levels: { '0': 'Active', '1': 'Closed', '2': 'Dropped', '3': 'Legacy' }}"  

sl_bar <- JS(sprintf("function (oSettings, json) { $('.spark:not(:has(canvas))').sparkline('html', {%s})}", bar_string)) 

d2 <- datatable(data.table(sparkline_df2_spread), 
  rownames = FALSE, 
  options = list(columnDefs = colDefs, 
  fnDrawCallback = sl_bar))

d2$dependencies <- append(d2$dependencies, htmlwidgets:::getDependency("sparkline"))

d2 

Выход: Изображение 174551 Это также хорошо работает с моими реальными данными (400, 000+).

Надеюсь, это полезно для тех, кто в ней нуждается. :)

  • 0
    Не могли бы вы объяснить пункт 3: «Конфигурирование DT ColumDef и fnCallback с использованием небольшого количества кода Java». Кроме того, вы нашли альтернативное решение после публикации?
0

Мы можем иметь похожий граф, используя library (ggplot2) и facet_grid чтобы иметь facet_grid гистограмму для каждого prodcut_type. и вы можете Proj_count_byTypeStatus Employee_name на оси x и Proj_count_byTypeStatus по оси y

library(ggplot2)

ggplot(test_df, aes(x = Employee_name, y = Proj_count_byTypeStatus, fill = Project_status)) + 
  geom_bar(stat = 'identity', position = 'stack') + facet_grid(~ Product_type)

и выход будет:

Изображение 174551

  • 0
    Привет, спасибо за усилия. Сначала я использовал метод ggplot, но потом понял, что таблица данных должна быть лучшим решением, поскольку в реальном наборе данных содержится более 10 тысяч наблюдений, что делает ось X чрезвычайно насыщенной. Таким образом, я ищу таблицу данных Sparkline способ сделать это. К сожалению, большинство примеров спарклайнов находятся в Java, с которым я не знаком ...
  • 0
    Итак, вам нужно привести воспроизводимый пример.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню