问题描述
我正在制作一个 Sankey 图表,我想在每列的顶部添加文本,以便简要说明所显示的内容。 来自 r-graph galery 的示例代码:
library(networkD3)
# A connection data frame is a list of flows with intensity for each flow
links <- data.frame(
source=c("group_A","group_A","group_B","group_C","group_E"),target=c("group_C","group_D","group_E","group_F","group_G","group_H"),value=c(2,3,2,1,3)
)
# From these flows we need to create a node data frame: it lists every entities involved in the flow
nodes <- data.frame(
name = unique(c(as.character(links$source),as.character(links$target)))
)
# With networkD3,connection must be provided using id,not using real name like in the links dataframe.. So we need to reformat it.
links$IDsource <- match(links$source,nodes$name)-1
links$IDtarget <- match(links$target,nodes$name)-1
# Make the Network
p <- sankeyNetwork(Links = links,Nodes = nodes,Source = "IDsource",Target = "IDtarget",Value = "value",NodeID = "name",sinksRight=FALSE)
p
networkD3::sankeyNetwork()
函数中没有此选项。
我的目标是这样的:
解决方法
library(networkD3)
library(htmlwidgets)
# A connection data frame is a list of flows with intensity for each flow
links <- data.frame(
source=c("group_A","group_A","group_B","group_C","group_E"),target=c("group_C","group_D","group_E","group_F","group_G","group_H"),value=c(2,3,2,1,3)
)
# From these flows we need to create a node data frame: it lists every entities involved in the flow
nodes <- data.frame(
name = unique(c(as.character(links$source),as.character(links$target)))
)
# With networkD3,connection must be provided using id,not using real name like in the links dataframe.. So we need to reformat it.
links$IDsource <- match(links$source,nodes$name) - 1
links$IDtarget <- match(links$target,nodes$name) - 1
# Make the Network
p <- sankeyNetwork(Links = links,Nodes = nodes,Source = "IDsource",Target = "IDtarget",Value = "value",NodeID = "name",sinksRight=FALSE)
htmlwidgets::onRender(p,'
function(el) {
var cols_x = this.sankey.nodes().map(d => d.x).filter((v,i,a) => a.indexOf(v) === i);
cols_x.forEach((d,i) => {
d3.select(el).select("svg")
.append("text")
.attr("x",d)
.attr("y",12)
.text("Step " + (i + 1));
})
}
')
或手动设置标签...
htmlwidgets::onRender(p,a) => a.indexOf(v) === i);
var labels = ["Step 2","Step 1","Step 3"];
cols_x.forEach((d,12)
.text(labels[i]);
})
}
')