You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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倍,完全违背桑基图的核心规则——每个节点的流入总和必须等于流出总和。

修正方案

  1. 处理负值:
    • 若为数据录入错误,直接将负值修正为合理正值;
    • 若表示反向流量,互换对应链路的Source和Target,并将VALUE改为正数。
  2. 修正流量守恒:
    调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:08:23