如何在 Sankey 图表 networkD3 中添加列标题

问题描述

我正在制作一个 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() 函数中没有此选项。

我的目标是这样的:

enter image description here

解决方法

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));
    })
  }
')

enter image description here


或手动设置标签...

htmlwidgets::onRender(p,a) => a.indexOf(v) === i);
    var labels = ["Step 2","Step 1","Step 3"];
    cols_x.forEach((d,12)
        .text(labels[i]);
    })
  }
')

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...