【问题标题】:create R highchart table with sparkline使用迷你图创建 R highchart 表
【发布时间】:2017-12-30 12:59:52
【问题描述】:

我正在尝试使用 R 创建带有 sparklines数据表,并将其用于我闪亮的仪表板。 简化的测试数据如下:

#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 用颜色“填充”标记

我使用 tableau 创建了我预期的图表,希望这有助于更好地理解我的问题:

感谢大家的帮助!

【问题讨论】:

  • 任何提示将不胜感激,您不必完成编码。谢谢!!

标签: javascript r highcharts dt sparklines


【解决方案1】:

终于想出办法来完成它。

本案例的基本思路是:

  1. 转换数据框,其中每个值单元格是一个列表,包括 Project_Status 的所有级别,用零完成空白。
  2. 使用 Product_type 的键传播值单元格。
  3. 使用一点 java 代码配置 DT ColumDef 和 fnCallback
  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 

输出: 这也适用于我的真实数据(400,000+ 行)。

希望这对有需要的人有所帮助。 :)

【讨论】:

  • 您介意解释一下第 3 点,“使用一点 java 代码在 DT ColumDef 和 fnCallback 上进行配置。”另外,您在发帖后是否找到了替代解决方案?
【解决方案2】:

我们可以通过使用library (ggplot2)facet_grid 为每个prodcut_type 分别制作一个条形图来获得类似的图表。你可以把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)

输出将是:

【讨论】:

  • 您好,感谢您的努力。我一开始使用的是 ggplot 方法,但后来我意识到数据表应该是最好的解决方案,因为真实数据集中有超过 1 万个观察值,这使得 x 轴非常拥挤。因此,我正在寻找 Data Table Sparkline 的方法来做到这一点。可悲的是,大多数迷你图示例都在我不熟悉的 java 中......
  • 所以,你需要提供一个可重现的例子。
  • 如果您仍然感兴趣,请在下方查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多