我使用NetworkD3 R软件包创建了一个Sankey Plot。以下是输出的示例:
我使用以下代码作为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
答案 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
答案 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")