我有一个在R中创建的桑基图。 它生成关系图,但节点名称放置在右侧节点的节点左侧。 我希望所有名字都在右边,这样真实的名字(更长(就不会相互重叠。
下面是一组完整的工作代码,它将生成我当前正在使用的图表。
library(networkD3)
nodes <- data.frame('name' =
c('Node0','Node1','Node2','Node3','Node4','Node5','Node6',
'Node7','Node8','Node9','Node10','Node11','Node12','Node13',
'Node14','Node15','Node16','Node17','Node18','Node19',
'Node20','Node21','Node22','Node23','Node24','Node25',
'Node26','Node27','Node28','Node29','Node30','Node31',
'Node32','Node33'))
links = as.data.frame(matrix(c(
0, 3,140,
0, 4,140,
0, 5,140,
0, 6,140,
1, 3,140,
1, 4,140,
1, 5,140,
1, 6,140,
2, 3,140,
2, 4,140,
2, 5,140,
2, 6,140,
3, 7,130,
3, 8,130,
3, 9,50,
3,10,50,
3,11,50,
4,12,140,
4,13,100,
4,14,100,
4,15,80,
5,16,150,
5,17,150,
5,18,60,
5,19,60,
6,20,180,
6,21,80,
6,22,80,
6,23,80,
7,24,13,
7,33,13,
7,31,104,
8,24,13,
8,33,13,
8,26,52,
8,27,52,
9,24,10,
9,33,10,
9,29,30,
9,30,30,
10,24,10,
10,33,10,
10,29,30,
10,30,30,
11,24,10,
11,33,10,
11,29,30,
11,30,30,
12,24,16,
12,33,16,
12,26,36,
12,27,36,
12,28,36,
13,24,10,
13,33,10,
13,26,30,
13,27,30,
13,28,30,
14,24,10,
14,33,10,
14,26,30,
14,27,30,
14,28,30,
15,24,10,
15,33,10,
15,31,60,
16,24,30,
16,33,30,
16,32,90,
17,24,30,
17,33,30,
17,32,90,
18,24,10,
18,33,10,
18,25,40,
19,24,30,
19,33,30,
20,24,90,
20,33,90,
21,33,80,
22,24,10,
22,33,10,
22,29,30,
22,30,30,
23,24,40,
23,33,40),
byrow = TRUE, ncol = 3))
names(links) = c("source", "target", "value")
sankeyNetwork(Links = links, Nodes = nodes,
Source = "source", Target = "target",
Value = "value", NodeID = "name",
fontSize= 15, nodeWidth = 20,
colourScale = JS("d3.scaleOrdinal(d3.schemeCategory20b);"))
您可以在创建桑基网络图后通过使用 htmlwidgets 包添加一些 JavaScript 来设置文本锚点。如果希望文本位于右侧节点的右侧,则可能还需要调整左边距。
library(htmlwidgets)
sn <- sankeyNetwork(Links = links, Nodes = nodes,
Source = "source", Target = "target",
Value = "value", NodeID = "name",
fontSize= 15, nodeWidth = 20, margin = list(left = 100),
colourScale = JS("d3.scaleOrdinal(d3.schemeCategory20b);"))
onRender(
sn,
'
function(el, x) {
d3.selectAll(".node text").attr("text-anchor", "begin").attr("x", 20);
}
'
)