R中的NetworkD3 Sankey Plot:如何仅从内部节点的右侧向左侧切换文本标签

时间:2017-08-02 16:47:37

标签: javascript r d3.js sankey-diagram networkd3

我使用NetworkD3 R软件包创建了一个Sankey Plot。以下是输出的示例:

Sankey Plot Example

我使用以下代码作为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

这是另一个: How to place node title to the left or right of the node in d3 Sankey graph?

答案以D3.js编码,我尚未学习,也不知道如何实现我的R代码,或者他们正在将文本标签移动到节点的右侧。

我可以在R中将内部节点的文本向左移动的任何建议都将非常感谢!

编辑:使用注释中给出的示例代码,当我使用set.seed时,它不会创建内部节点,那么这可能是问题吗? Output Example

2 个答案:

答案 0 :(得分:2)

从@afterportfolio的answer开始,您可以修改它以在应用格式化之前过滤到任何节点子集...

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

enter image description here

答案 1 :(得分:0)

我只会编辑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()函数并使用indexOf(),而mid是R中的变量,

Middle <- c("Middle 1","Middle 2","Middle 3","Middle 4")