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")
我使用 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")