京公网安备 11010802034615号
经营许可证编号:京B2-20210330
在数据可视化领域,单一图表往往难以承载多维度信息 —— 力导向图擅长展现节点间的关联结构与空间分布,却无法直观呈现 “流量 / 权重” 的流转差异;桑基图专注于流量的路径、占比与损耗,却难以体现节点在整体网络中的位置关系。而 “叠加在力导向图上的桑基图”,通过将两种图表的核心优势融合,实现了 “网络结构” 与 “流量动态” 的同步呈现,成为分析复杂系统(如用户行为路径、供应链物流、能源传输网络)的高效工具。本文将从融合逻辑、实战场景、技术实现与优化方向四个维度,解析这种复合型可视化的价值与落地方法。
要理解融合的必要性,需先明确两种图表的 “优势互补性”—— 单一图表的局限,正是叠加设计的突破口。
力导向图(Force-Directed Graph)以 “模拟物理力学” 为核心逻辑:节点间通过 “斥力” 保持距离,关联节点通过 “引力” 连接,最终形成布局均衡的网络结构。其核心价值在于:
直观呈现节点关联:清晰展示 “谁与谁相连”,尤其适合节点数量多、关系复杂的网络(如社交关系网、APP 功能跳转路径);
体现节点重要性:可通过节点大小映射 “度数(关联数量)”,让核心节点(如社交网络中的 KOL)一目了然;
动态布局适配:支持缩放、拖拽,便于探索大型网络的局部细节(如从 “全行业供应链” 聚焦到 “某区域供应商”)。
但力导向图的局限同样明显:无法量化节点间的 “流量 / 权重” 差异。例如,在 “用户从首页跳转到各功能模块” 的分析中,力导向图能展示 “首页与‘商品列表’‘购物车’‘个人中心’相连”,却无法区分 “1000 人从首页到商品列表” 与 “100 人从首页到个人中心” 的流量差异 —— 所有连接边的视觉权重一致,导致关键流量信息被掩盖。
桑基图(Sankey Diagram)以 “流” 为核心元素:节点代表 “源头 / 中转 / 终点”,连接边的宽度映射 “流量大小”,颜色区分 “流的类型”,核心价值在于:
量化流量路径与占比:清晰展示 “流量从哪里来、到哪里去、占比多少”,例如 “电商平台用户从不同入口(APP、小程序、PC 端)到下单的路径占比”;
凸显流量损耗 / 转化:通过边的宽度变化,直观呈现流量在各环节的流失(如 “1000 个访问用户中,800 人进入商品页,300 人加入购物车,100 人最终下单”);
聚焦 “路径” 而非 “节点”:适合分析线性或多分支的流转场景,如能源从发电厂到用户的传输路径、资金在各部门的流转分配。
桑基图的局限则在于:节点布局固定,无法体现整体网络结构。例如,在 “全国供应链网络” 分析中,桑基图能展示 “北京仓库→上海门店”“广州仓库→深圳门店” 的货物流量,却无法呈现 “北京仓库与广州仓库是否存在调拨关系”“上海门店与深圳门店是否共享供应商”—— 节点仅按 “流转顺序” 排列,丢失了网络的全局结构信息。
当桑基图的 “流量边” 叠加在力导向图的 “结构节点” 上时,两种图表的优势形成互补,实现了 “双维度信息同步传递”:
既知 “谁相连”,也知 “流量多大”:力导向图的节点布局展示 “网络结构”(如 “首页 - 商品列表 - 购物车” 的关联),桑基图的宽窄边展示 “流量差异”(如 “首页→商品列表” 的流量是 “首页→个人中心” 的 10 倍);
既见 “全局结构”,也见 “局部流转”:力导向图呈现节点在整体网络中的位置(如 “核心供应商” 位于网络中心),桑基图聚焦节点间的流量细节(如 “核心供应商向 3 个仓库的供货占比”);
既懂 “静态关系”,也懂 “动态变化”:力导向图展现 “静态关联结构”(如供应链的固定合作关系),桑基图展现 “动态流量变化”(如旺季与淡季的货物流量差异)。
叠加不是简单的 “图层覆盖”,而是需要从 “数据对齐”“视觉平衡”“交互设计” 三个层面进行精细化设计,避免出现 “结构混乱”“流量遮挡” 等问题。
两种图表的叠加,核心前提是 “共享同一套节点体系”,需完成以下数据预处理:
统一节点 ID 与属性:
关联流量与结构属性:
处理 “多流量类型”:
视觉设计的核心是 “让两种图表元素互不干扰,且信息层级清晰”,需遵循以下原则:
节点与流量边的视觉分层:
布局适配:让流量边 “贴合” 结构边:
力导向图布局完成后,桑基图的流量边需沿结构边的路径绘制,避免出现 “流量边跨越其他节点” 的情况;
若节点布局较密集,可通过 “力导向图参数调整”(如增大节点斥力、优化迭代次数)拉开节点间距,为流量边预留视觉空间。
比例控制:避免流量边过宽或过窄:
流量边宽度需设置 “合理范围”(如最小宽度 1px,最大宽度 20px),避免小流量边看不见、大流量边遮挡节点;
可采用 “对数缩放”(如 flow_value 取对数后映射宽度),平衡 “极大流量” 与 “极小流量” 的视觉差异。
叠加图表的交互设计需支持 “结构与流量的联动查询”,让用户既能探索 “结构细节”,也能追溯 “流量来源”,核心交互功能包括:
hover 联动:显示 “结构 + 流量” 双重信息:
鼠标 hover 力导向图节点:显示 “节点名称、类型、关联节点数量”(结构信息)+“该节点的流入 / 流出总流量”(流量信息);
鼠标 hover 桑基图流量边:显示 “源节点 - 目标节点名称、流量值、流量占比(如 “占源节点总流出的 25%”)、流量类型”;
示例:hover “核心供应商” 节点,既显示 “关联 3 个仓库”,也显示 “总供货量 1000 吨,其中向 A 仓库供货 400 吨(40%)、B 仓库 300 吨(30%)、C 仓库 300 吨(30%)”。
筛选联动:聚焦 “特定结构 / 流量”:
结构筛选:点击某类节点(如 “所有门店节点”),高亮该类节点及其关联边,同时高亮流经这些节点的流量边;
流量筛选:选择 “流量类型 = 新用户”,仅显示新用户相关的流量边,力导向图结构边保持低饱和度,避免干扰;
场景价值:在 “供应链分析” 中,筛选 “流量值 > 500 吨” 的边,可快速定位 “核心物流路径”。
缩放与平移:适配大型网络探索:
支持整体缩放:缩放时,节点大小、流量边宽度按比例调整,避免缩放后流量边消失或节点重叠;
支持局部平移:拖拽视图时,结构节点与流量边同步移动,保持相对位置不变,便于聚焦局部网络(如 “某区域的供应商 - 仓库 - 门店” 子网络)。
“力导向图 + 桑基图” 的叠加设计,在需要同时分析 “结构关系” 与 “流量动态” 的场景中价值显著,以下为三个典型落地场景:
在 APP / 网站的用户行为分析中,需同时关注 “用户能从哪些页面跳转”(结构)和 “多少用户这么跳”(流量),叠加图表可清晰呈现:
结构层(力导向图):节点为 “页面”(首页、商品列表、详情页、购物车、下单页),边为 “可跳转关系”,核心页面(如首页、商品列表)因关联多而位于中心;
流量层(桑基图):边宽度映射 “页面间的用户跳转量”,颜色区分 “新用户” 与 “老用户”;
业务价值:
在多节点、多路径的供应链中,需同时掌握 “谁与谁合作”(结构)和 “货物如何流转”(流量),叠加图表可解决:
结构层(力导向图):节点为 “供应商、仓库、门店”,边为 “合作关系”(如供应商→仓库、仓库→门店),核心供应商因连接多个仓库而位于网络中心;
流量层(桑基图):边宽度映射 “货物运输量”,颜色区分 “常温商品” 与 “冷链商品”;
业务价值:
在电力、天然气等能源网络中,需同时监控 “节点连接稳定性”(结构)和 “能源传输效率”(流量),叠加图表可实现:
结构层(力导向图):节点为 “发电厂、变电站、用户端(工业 / 居民)”,边为 “传输线路”,变电站因连接发电厂与用户端而成为关键枢纽;
流量层(桑基图):边宽度映射 “电力传输量”,颜色区分 “高峰时段” 与 “低谷时段”;
业务价值:
“力导向图 + 桑基图” 的叠加实现,需根据 “技术门槛”“交互需求” 选择合适工具,主流方案分为 “低代码工具(如 Tableau、Power BI)” 和 “代码开发(如 D3.js、ECharts)” 两类。
以 Tableau 为例,通过 “双层工作表叠加” 实现,核心步骤:
步骤 1:构建力导向图基础层:
数据准备:节点表(node_id, node_name, node_type)、结构边表(source_id, target_id);
制作图表:将 “source_id”“target_id” 拖到 “列”,“node_name” 拖到 “详细信息”,选择 “图表类型→力导向图”,设置节点大小映射 “关联数量”,颜色映射 “node_type”。
步骤 2:构建桑基图流量层:
数据准备:流量边表(source_id, target_id, flow_value, flow_type);
制作图表:将 “source_id”“target_id” 拖到 “列”,“flow_value” 拖到 “行”,选择 “图表类型→桑基图”,设置边宽度映射 “flow_value”,颜色映射 “flow_type”,调整边透明度为 0.7。
步骤 3:叠加两层工作表:
以 D3.js 为例(最灵活的可视化库),核心代码逻辑(简化版):
// 1. 初始化SVG画布
const svg = d3.select("#chart")
.append("svg")
.attr("width", 800)
.attr("height", 600);
// 2. 加载并预处理数据(统一节点ID)
d3.json("network_data.json").then(data => {
const nodes = data.nodes; // 节点数据:[{id, name, type}, ...]
const links = data.links; // 结构边数据:[{source, target}, ...]
const flows = data.flows; // 流量边数据:[{source, target, value, type}, ...]
// 3. 构建力导向图模拟(基础结构层)
const simulation = d3.forceSimulation(nodes)
.force("link", d3.forceLink(links).id(d => d.id).distance(100)) // 结构边距离
.force("charge", d3.forceManyBody().strength(-300)) // 节点斥力
.force("center", d3.forceCenter(400, 300)); // 画布中心
// 4. 绘制力导向图结构边(细灰色,低饱和度)
const structureLinks = svg.append("g")
.selectAll("line")
.data(links)
.enter()
.append("line")
.attr("stroke", "#999")
.attr("stroke-width", 1)
.attr("stroke-opacity", 0.5);
// 5. 绘制力导向图节点(实心圆,颜色映射类型)
const nodesG = svg.append("g")
.selectAll("circle")
.data(nodes)
.enter()
.append("circle")
.attr("r", d => d.type === "core" ? 15 : 8) // 核心节点更大
.attr("fill", d => d.type === "supplier" ? "#4285F4" : "#34A853")
.call(d3.drag() // 支持拖拽交互
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
// 6. 绘制桑基图流量边(宽边,半透明,颜色映射流量类型)
const flowLinks = svg.append("g")
.selectAll("path")
.data(flows)
.enter()
.append("path")
.attr("d", d => { // 沿结构边路径绘制贝塞尔曲线
const source = nodes.find(n => n.id === d.source);
const target = nodes.find(n => n.id === d.target);
return `M${source.x},${source.y} Q${(source.x+target.x)/2},${(source.y+target.y)/2} ${target.x},${target.y}`;
})
.attr("stroke", d => d.type === "new" ? "#EA4335" : "#FBBC05")
.attr("stroke-width", d => Math.max(1, Math.log10(d.value) * 2)) // 对数缩放宽度
.attr("stroke-opacity", 0.7)
.attr("fill", "none");
// 7. 力导向图动画更新(确保流量边随节点移动)
simulation.on("tick", () => {
// 更新结构边位置
structureLinks
.attr("x1", d => d.source.x)
.attr("y1", d => d.source.y)
.attr("x2", d => d.target.x)
.attr("y2", d => d.target.y);
// 更新节点位置
nodesG
.attr("cx", d => d.x)
.attr("cy", d => d.y);
// 更新流量边位置(关键:随节点移动重新绘制路径)
flowLinks
.attr("d", d => `M${d.source.x},${d.source.y} Q${(d.source.x+d.target.x)/2},${(d.source.y+d.target.y)/2} ${d.target.x},${d.target.y}`);
});
// 8. 添加hover交互(显示结构+流量信息)
flowLinks.on("mouseover", function(event, d) {
d3.select(this).attr("stroke-opacity", 1); // 高亮流量边
// 显示 tooltip:包含源节点、目标节点、流量值、占比
tooltip.style("display", "block")
.html(`<b>路径</b>: ${d.source.name} → ${d.target.name}<br>
<b>流量</b>: ${d.value}吨<br>
<b>占比</b>: ${(d.value/d.source.totalFlow*100).toFixed(1)}%`);
});
});
// 拖拽交互函数(省略dragstarted、dragged、dragended实现)
function dragstarted(event, d) { ... }
function dragged(event, d) { ... }
function dragended(event, d) { ... }
| 工具类型 | 代表工具 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| 低代码工具 | Tableau、Power BI | 无需编码,快速上手;支持 Dashboard 联动 | 定制化程度低;大型网络性能有限 | 业务分析师快速验证;中小型数据集 |
| 代码开发工具 | D3.js、ECharts | 高度定制;支持大型网络与复杂交互 | 技术门槛高;开发周期长 | 工程师落地复杂系统;大型数据集 |
| 专业可视化工具 | Gephi+Python | 支持网络分析算法;可导出高清图 | 交互功能弱;需多工具配合 | 学术研究;静态报告生成 |
在落地过程中,易出现 “视觉混乱”“性能卡顿”“信息过载” 等问题,需从以下维度优化:
问题表现:节点数量超过 100 个时,力导向图布局拥挤,桑基图流量边相互交叉,无法区分;
解决方案:
分层筛选:通过 “节点层级” 筛选(如先展示 “核心节点”,点击后展开 “关联节点”);
聚合节点:将 “同类型、近距离” 的节点聚合(如将 “某区域的 10 家门店” 聚合为 “区域门店” 节点),流量边按聚合后节点重新计算;
局部聚焦:支持 “框选放大”,仅显示选中区域的节点与流量,避免全局混乱。
问题表现:大流量边(如宽度 20px)覆盖节点或结构边,导致无法点击节点;
解决方案:
视觉层级调整:将 “节点” 置于最上层(z-index 最高),“流量边” 置于中间层,“结构边” 置于最下层;
动态宽度:鼠标 hover 时才放大流量边宽度(默认宽度缩小 50%),既保证平时布局清晰,又能查看细节;
透明度梯度:流量边越宽,透明度越低(如宽度 20px 时透明度 0.5,宽度 2px 时透明度 0.9),避免宽边遮挡。
问题表现:节点数量多或流量边复杂时,拖拽节点、hover 显示信息出现明显延迟;
解决方案:
性能优化(代码开发场景):
使用 “WebGL” 渲染(如 Three.js)替代 SVG,提升大型网络的渲染速度;
批量更新:力导向图 “tick” 事件中,每 10 帧更新一次流量边位置,而非每帧更新;
简化交互(低代码场景):
关闭 “实时拖拽更新”,拖拽结束后再更新流量边位置;
减少 hover 信息的复杂度,仅显示核心数据(如节点名称、流量值),点击后再显示详细信息。
问题表现:流量类型超过 5 种时,颜色差异不明显,无法区分 “新用户”“老用户”“流失用户” 等类型;
解决方案:
组合编码:用 “颜色 + 线型” 区分(如红色实线代表新用户,红色虚线代表流失用户);
图例优化:将 “流量类型图例” 与 “节点类型图例” 分开,标注清晰;
一致性原则:同一流量类型在不同图表(如叠加图、辅助柱状图)中颜色保持一致,避免用户认知混乱。
“力导向图与桑基图的叠加”,本质不是为了 “图表创新”,而是为了 “更高效地传递复杂系统的多维度信息”—— 让决策者无需在 “结构图表” 与 “流量图表” 之间切换,就能同时把握 “网络关系” 与 “动态流转”,减少信息获取成本。
这种融合可视化的价值,最终体现在 “业务决策效率的提升”:
对用户行为分析师,它能快速定位 “低效路径” 与 “转化瓶颈”;
对供应链管理者,它能直观识别 “风险节点” 与 “优化空间”;
对能源调度员,它能实时监控 “传输结构” 与 “负载平衡”。
未来,随着数据复杂度的提升,“多图表叠加” 将成为可视化的重要方向 —— 但无论如何融合,核心原则始终不变:以业务需求为导向,让数据信息清晰、高效地服务于决策,而非追求 “技术复杂” 或 “视觉炫酷”。

数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在Python开发中,HTTP请求是与外部服务交互的核心场景——调用第三方API、对接微服务、爬取数据等都离不开它。虽然requests库已 ...
2025-12-12在数据驱动决策中,“数据波动大不大”是高频问题——零售店长关心日销售额是否稳定,工厂管理者关注产品尺寸偏差是否可控,基金 ...
2025-12-12在CDA(Certified Data Analyst)数据分析师的能力矩阵中,数据查询语言(SQL)是贯穿工作全流程的“核心工具”。无论是从数据库 ...
2025-12-12很多小伙伴都在问CDA考试的问题,以下是结合 2025 年最新政策与行业动态更新的 CDA 数据分析师认证考试 Q&A,覆盖考试内容、报考 ...
2025-12-11在Excel数据可视化中,柱形图因直观展示数据差异的优势被广泛使用,而背景色设置绝非简单的“换颜色”——合理的背景色能突出核 ...
2025-12-11在科研实验、商业分析或医学研究中,我们常需要判断“两组数据的差异是真实存在,还是偶然波动”——比如“新降压药的效果是否优 ...
2025-12-11在CDA(Certified Data Analyst)数据分析师的工作体系中,数据库就像“数据仓库的核心骨架”——所有业务数据的存储、组织与提 ...
2025-12-11在神经网络模型搭建中,“最后一层是否添加激活函数”是新手常困惑的关键问题——有人照搬中间层的ReLU激活,导致回归任务输出异 ...
2025-12-05在机器学习落地过程中,“模型准确率高但不可解释”“面对数据噪声就失效”是两大核心痛点——金融风控模型若无法解释决策依据, ...
2025-12-05在CDA(Certified Data Analyst)数据分析师的能力模型中,“指标计算”是基础技能,而“指标体系搭建”则是区分新手与资深分析 ...
2025-12-05在回归分析的结果解读中,R方(决定系数)是衡量模型拟合效果的核心指标——它代表因变量的变异中能被自变量解释的比例,取值通 ...
2025-12-04在城市规划、物流配送、文旅分析等场景中,经纬度热力图是解读空间数据的核心工具——它能将零散的GPS坐标(如外卖订单地址、景 ...
2025-12-04在CDA(Certified Data Analyst)数据分析师的指标体系中,“通用指标”与“场景指标”并非相互割裂的两个部分,而是支撑业务分 ...
2025-12-04每到“双十一”,电商平台的销售额会迎来爆发式增长;每逢冬季,北方的天然气消耗量会显著上升;每月的10号左右,工资发放会带动 ...
2025-12-03随着数字化转型的深入,企业面临的数据量呈指数级增长——电商的用户行为日志、物联网的传感器数据、社交平台的图文视频等,这些 ...
2025-12-03在CDA(Certified Data Analyst)数据分析师的工作体系中,“指标”是贯穿始终的核心载体——从“销售额环比增长15%”的业务结论 ...
2025-12-03在神经网络训练中,损失函数的数值变化常被视为模型训练效果的“核心仪表盘”——初学者盯着屏幕上不断下降的损失值满心欢喜,却 ...
2025-12-02在CDA(Certified Data Analyst)数据分析师的日常工作中,“用部分数据推断整体情况”是高频需求——从10万条订单样本中判断全 ...
2025-12-02在数据预处理的纲量统一环节,标准化是消除量纲影响的核心手段——它将不同量级的特征(如“用户年龄”“消费金额”)转化为同一 ...
2025-12-02在数据驱动决策成为企业核心竞争力的今天,A/B测试已从“可选优化工具”升级为“必选验证体系”。它通过控制变量法构建“平行实 ...
2025-12-01