R Highcharter Sankey节点列属性问题

ins*_*ven 12 r highcharts sankey-diagram r-highcharter

我想使用highcharter包在R中绘制一个Sankey图.我在格式化时面临问题.这是一个例子.

# devtools::install_github("jbkunst/highcharter")
library(highcharter)

hc_dat <- data.frame(from = c("A", "A", "B"), 
                     to = c("C", "B", "C"), N = c(7, 5, 5))
highchart() %>%
  hc_add_series(data = hc_dat, type = "sankey", 
                hcaes(from = from, to = to, weight = N))
Run Code Online (Sandbox Code Playgroud)

这产生了以下图片: 外的盒子

我希望B节点处于中间位置,以便更好地了解情节.所以我尝试实现这个操作Highcharts系列的column属性nodes:

nodes_mapping <- list(list(id = "A", column = 0),
                      list(id = "B", column = 1),
                      list(id = "C", column = 2))

highchart() %>%
  hc_add_series(data = hc_dat, type = "sankey", 
                nodes = nodes_mapping,
                hcaes(from = from, to = to, weight = N))
Run Code Online (Sandbox Code Playgroud)

这不会改变图片.我发现,原因如下:highcharter用于jsonlite::toJSON转换R对象,它[]在JSON中提供了不必要的东西,这会破坏Highcharts的行为.

jsonlite::toJSON(nodes_mapping)
# [{"id":["A"],"column":[0]},{"id":["B"],"column":[1]},{"id":["C"],"column":[2]}]
Run Code Online (Sandbox Code Playgroud)

相同但有"A"代替["A"]等将起作用.JS中的证明就在这个jsfiddle中.

我试图在JavaScript中嵌入JavaScript htmlwidgets::JS,但它不起作用:

highchart() %>%
  hc_add_series(data = hc_dat, type = "sankey", 
                nodes = JS('[{"id":"A","column":[0]},{"id":"B","column":[1]},{"id":"C","column":[2]}]'),
                hcaes(from = from, to = to, weight = N))
# empty chart

highchart() %>%
  hc_add_series(data = hc_dat, type = "sankey", 
                JS('nodes: [{"id":"A","column":[0]},{"id":"B","column":[1]},{"id":"C","column":[2]}]'),
                hcaes(from = from, to = to, weight = N))
# Error: inherits(mapping, "hcaes") is not TRUE

highchart() %>%
  hc_add_series(data = hc_dat, type = "sankey", 
                hcaes(from = from, to = to, weight = N),
                JS('nodes: [{"id":"A","column":[0]},{"id":"B","column":[1]},{"id":"C","column":[2]}]'))
# Error: Column 4 must be named
Run Code Online (Sandbox Code Playgroud)

所以,我在这里被困住了.有谁知道hc_add_series在这种情况下如何考虑系列的属性?

Lst*_*tat 3

从 A->B 和从 B->C 的 Sankey 可以通过重新定义底层数据来完成:

 hc_dat <- data.frame(from = c("A", "B"), 
                 to = c("B", "C"), N = c(7, 5))
Run Code Online (Sandbox Code Playgroud)

同样,可以从A->C定义节点

 hc_dat <- data.frame(from = c("A", "B", "A"), 
                 to = c("B", "C", "C"), N = c(5, 5, 7))
Run Code Online (Sandbox Code Playgroud)

不过,这并没有呈现出漂亮的情节。