使用R的networkD3包生成桑基图结果异常:支出节点数值不匹配
桑基图异常问题的分析与解决
核心问题1:负值流量不被支持
networkD3的sankeyNetwork组件不处理负值流量,你数据中Source=1对应的VALUE=-17146.81会被直接忽略,导致流入Expenditure节点的总流量少了这部分的绝对值,最终流入总和仅为预期的2/3。
核心问题2:节点流量不守恒
Expenditure节点(索引9)的流入总和为:
38415.22 - 17146.81 + 1769578.74 = 1790847.15
但你设置的流出流量是三个相同的1790847.15,总流出是流入的3倍,完全违背桑基图的核心规则——每个节点的流入总和必须等于流出总和。
修正方案
- 处理负值:
- 若为数据录入错误,直接将负值修正为合理正值;
- 若表示反向流量,互换对应链路的
Source和Target,并将VALUE改为正数。
- 修正流量守恒:
调整Expenditure的流出值,确保三个流出值的总和等于流入总和1790847.15,比如按业务逻辑比例分配。
修正后的示例代码
library(networkD3) nodes <- structure(list(STO = c("D21", "D31", "P1", "P11", "P12", "P13", "B1N", "P2", "P51c", "Expenditure")), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame")) # 修正反向流量的方向与负值,同时均分流出流量 links <- structure(list(Source = c(0, 9, 2, 3, 4, 5, 9, 9, 9), Target = c(9, 1, 9, 2, 2, 2, 6, 7, 8), VALUE = c(38415.22308114, 17146.81020189, 1769578.74087679, 1647394.387995, 8271.16365114771, 113913.189230644, 596949.05125201, 596949.05125201, 596949.05125202)), row.names = c(NA, -9L), class = c("tbl_df", "tbl", "data.frame")) sankeyNetwork(links, nodes, Source = "Source", Target = "Target", Value = "VALUE", NodeID = "STO")
内容的提问来源于stack exchange,提问作者arnyeinstein
相关产品推荐
相关产品推荐

