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

NetworkD3 Sankey Plot in R: How to switch text labels from the right to the left of the inner nodes only

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

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)

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

我研究过类似的问题:

这是另一个:

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

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

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

从@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

我只会编辑 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(),中间是R中的一个变量,

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