R语言Sankey图异常:T1显示为节点而非阶段流向的修复求助
问题描述
我想要创建一个展示不同阶段的Sankey图,使用了如下R代码:
# Load necessary libraries library(networkD3) library(dplyr) # Group by clinical and pathologic stages, count the number of transitions links <- d_filtered %>% count(cl_max_stage, p_max_stage_T1) %>% rename(source = cl_max_stage, target = p_max_stage_T1, value = n) # Print the links to see the result print(links) # Step 2: Correct connection data frame for flows between stages # Create a valid connection data frame, ensuring source and target match links <- data.frame( source=c("Ta","Tis","T1"), # Define sources target=c("T1","T1","T1"), # Define corresponding targets value=c(48, 20, 285) # Define flow values for each connection ) # Step 3: Create a node data frame from the unique values of source and target nodes <- data.frame( name=c(as.character(links$source), as.character(links$target)) %>% unique() ) # Step 4: Reformat the links data to use ID indexes instead of stage names links$IDsource <- match(links$source, nodes$name) - 1 links$IDtarget <- match(links$target, nodes$name) - 1 # Step 5: Create the Sankey diagram p <- sankeyNetwork( Links = links, Nodes = nodes, Source = "IDsource", Target = "IDtarget", Value = "value", NodeID = "name", sinksRight = FALSE # Controls the direction of the diagram ) # Display the Sankey diagram p
但输出结果里T1只显示成节点,没有Stage1到Stage2的流向;我试了ggplot2相关的Sankey图代码,还是遇到同样问题,该怎么解决?
解决方案
问题核心是你提供的连接数据(links)里根本没定义T1到Stage2的流向关系,Sankey图只会根据给定的links绘制存在的连接,没写的连接不会自动生成。要显示Stage1到Stage2的流向,得修改links数据,添加对应的条目:
补充Stage2节点及流向数据
修改links数据,加入T1到Stage2的连接,同时更新nodes数据包含Stage2:# 补充T1到Stage2的流向数据 links <- data.frame( source=c("Ta","Tis","T1", "T1"), # 新增T1作为来源指向Stage2 target=c("T1","T1","T1", "Stage2"), # 新增Stage2作为目标节点 value=c(48, 20, 100, 185) # 拆分原T1的285,一部分留作自身循环(如果需要),一部分流向Stage2 ) # 重新生成节点数据,自动包含新增的Stage2 nodes <- data.frame( name=c(as.character(links$source), as.character(links$target)) %>% unique() ) # 重新匹配节点ID索引(networkD3要求索引从0开始) links$IDsource <- match(links$source, nodes$name) - 1 links$IDtarget <- match(links$target, nodes$name) - 1 # 重新生成Sankey图 p <- sankeyNetwork( Links = links, Nodes = nodes, Source = "IDsource", Target = "IDtarget", Value = "value", NodeID = "name", sinksRight = FALSE ) p重要提示
- 不管用networkD3还是ggplot2的Sankey工具,流向都完全依赖数据中的
source和target配对,没有的连接不会凭空出现。 - 如果是从原始数据
d_filtered统计生成links,先看print(links)的输出,确认里面有没有T1到Stage2的条目。如果没有,说明原始数据里就没有对应的阶段转换记录,要么补充原始数据,要么调整统计逻辑。 - 要是不需要T1的自循环(即T1到T1的流向),可以把对应条目删掉,只保留T1到Stage2的连接。
- 不管用networkD3还是ggplot2的Sankey工具,流向都完全依赖数据中的
内容的提问来源于stack exchange,提问作者kathi
相关产品推荐
相关产品推荐

