Python桑基图:展示数据流转关系
别再用干瘪的饼图了!用Python画桑基图,让数据流转“活”起来
做数据分析汇报时,咱们经常会遇到这样的头疼场景:想展示用户从注册到购买的流失路径,或者公司各部门的资金流向。用饼图吧,只能看个静态比例;用柱状图吧,又体现不出前后的承接关系。这时候,桑基图(Sankey Diagram)就该登场了。
桑基图就像是城市早晚高峰的地铁换乘路线图,线条的粗细代表流量的大小,线条的走向代表数据的流转。它不仅能让你看清“有多少”,更能直观展示“从哪来、到哪去、在哪分叉”。
搞懂了概念,咱们直接拿一个真实的业务场景来上手实战。假设我们要分析某电商平台的用户行为路径,看看用户从“首页”进入后,最终是完成了“购买”,还是在“购物车”、“详情页”等环节流失了。
在Python中,绘制交互式桑基图最顺手的工具是 pyecharts。它底层基于Echarts,生成的图表不仅颜值高,还支持鼠标悬停查看具体数值。
安装第三方库是第一步,打开终端运行 pip install pyecharts 即可。
接下来是核心环节,很多新手会在这里卡壳。桑基图的数据结构不像折线图那样直接扔个DataFrame进去就行,它需要严格区分节点(Nodes) 和连线(Links)。
构建节点数据(Nodes),其实就是把数据流转中涉及的所有“站点”提取出来,去重后变成一个字典列表。
nodes = [{'name': '首页'}, {'name': '详情页'}, {'name': '购物车'}, {'name': '购买'}, {'name': '流失'}]
构建连线数据(Links),则是定义节点之间的流向和流量大小。这里的 source 是起点,target 是终点,value 是流转的用户量。
links = [
{'source': '首页', 'target': '详情页', 'value': 800},
{'source': '首页', 'target': '流失', 'value': 200},
{'source': '详情页', 'target': '购物车', 'value': 500},
{'source': '详情页', 'target': '流失', 'value': 300},
{'source': '购物车', 'target': '购买', 'value': 350},
{'source': '购物车', 'target': '流失', 'value': 150}
]
数据理顺后,就是渲染并输出图表。通过 Sankey() 类将数据喂进去,稍微调整一下配色和提示框,一张专业的业务流转图就生成了。
from pyecharts import options as opts
from pyecharts.charts import Sankey
sankey = (
Sankey()
.add(
"",
nodes,
links,
linestyle_opt=opts.LineStyleOpts(opacity=0.3, curve=0.5, color="source"),
label_opts=opts.LabelOpts(position="right"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="电商用户行为流转图"))
.render("user_flow.html")
)
图表画出来了,但想在实际项目中做得漂亮且专业,还得注意几个容易踩坑的细节。
节点名称必须绝对一致。在构建Links时,source 和 target 里的字符串必须和Nodes里的名称一模一样,连一个多余的空格都不能有。否则图表会直接报错或者出现断线,排查起来非常折磨人。建议在处理数据时,提前用 strip() 清洗一下字符串。
克制节点数量。桑基图虽然强大,但如果节点和连线太多,图表就会变成一团乱麻的“蜘蛛网”,完全失去可读性。遇到复杂的业务场景,建议合并同类项,或者只提取流量占比 Top 80% 的核心路径进行展示,把长尾数据折叠成一个“其他”节点。
巧用颜色映射。默认情况下,桑基图的连线颜色是跟随源节点的。如果业务上需要强调“流失”这种负面路径,可以通过自定义 itemstyle_opts,把流向“流失”节点的线条统一设置为灰色或警示色,让汇报时的视觉焦点更集中。
数据可视化的本质不是为了炫技,而是为了降低沟通成本。当你下次再面对复杂的转化漏斗或资源分配问题时,不妨放下干瘪的饼图,用桑基图让数据的流转真正“活”起来。理清了数据的来龙去脉,业务优化的方向自然也就浮出水面了。


还没有评论,来说两句吧...