1

我使用 NetworkD3 R 包创建了一个桑基图。下面是一个输出示例:

桑基图示例

我对 Sankey 使用了以下代码:

sankeyNetwork(Links = SankeyLinks, Nodes = SankeyNodes, Source = "source",
          Target = "target", Value = "value", NodeID = "names", 
          fontSize = 14, nodeWidth = 20,nodePadding = 15,NodeGroup = "nodeColor",
          colourScale = JS(ColourScale), LinkGroup = "linkColor",
          sinksRight = T)

网络在中间节点的右侧生成文本标签,将链接集中到叶节点。我想将文本切换到内部节点的左侧,而不更改开始节点和叶节点(分别为右侧和左侧)上的文本位置。

我研究了一个类似的问题:Place text values to right of sankey diagram

这是另一个: 如何将节点标题放在d3 Sankey图中节点的左侧或右侧?

答案是用 D3.js 编码的,我还没有学过,也不知道如何在我的 R 代码中实现,或者它们正在将文本标签移动到节点的右侧。

任何我可以在 R 中实施以将内部节点的文本向左移动的建议将不胜感激!

编辑:使用评论中给出的示例代码,当我使用 set.seed 时,它不会创建内部节点,所以这可能是问题吗? 输出示例

4

2 回答 2

3

从@timelyportfolio 的答案开始,您可以在应用格式之前对其进行修改以过滤到任何节点子集...

library(networkD3)
library(htmlwidgets)

links <- data.frame(
  src = c(0,0,1,1,2,2,3,3,4,4,5,5,6),
  target = c(3,6,4,5,5,6,7,9,8,9,7,10,7),
  value = 1
)

nodes <- data.frame(name = c(1, 2, 3,
                             "Middle 1", "Middle 2", "Middle 3", "Middle 4", 
                             4,5,6,7))

sn <- sankeyNetwork(
  Links=links, Nodes=nodes, Source='src', Target='target',
  Value='value', NodeID='name', fontSize=16,
  width=600, height=300,
  margin = list("left"=100)
)

sn

sn <- onRender(
  sn,
  '
  function(el,x){
  // select all our node text
  d3.select(el)
  .selectAll(".node text")
  .filter(function(d) { return d.name.startsWith("Middle"); })
  .attr("x", x.options.nodeWidth - 16)
  .attr("text-anchor", "end");
  }
  '
)

sn$jsHooks$render[[1]]
# $code
# [1] "\n  function(el,x){\n  // select all our node text\n  d3.select(el)\n  .selectAll(\".node text\")\n  .filter(function(d) { return d.name.startsWith(\"Middle\"); })\n  .attr(\"x\", x.options.nodeWidth - 16)\n  .attr(\"text-anchor\", \"end\");\n  }\n  "
# 
# $data
# NULL

sn

在此处输入图像描述

于 2017-08-03T22:59:03.870 回答
2

我将只编辑 CJ Yetman 的答案,他的答案很棒而且很有帮助。

错误出现在他函数的这行代码中

  .filter(function(d) { return d.name.startsWith("Middle"); })

这是我为使其正常工作所做的工作

onRender(
        sn,
        paste0('
        function(el,x){
        d3.select(el)
        .selectAll(".node text")
        .filter(function(d) { return (["',paste0(Middle,collapse = '","'),'"].indexOf(d.name) > -1);})
        .attr("x", 6 + x.options.nodeWidth)
        .attr("text-anchor", "end");
        }
        ')
)

我没有使用startsWith()function 和 used indexOf(),而 middle 是 R 中的一个变量,即,

Middle <- c("Middle 1","Middle 2","Middle 3","Middle 4")
于 2017-08-23T10:03:28.513 回答