手把手教你用 Python 绘制酷炫的桑基图!
作者 | 周志鹏
责编 | 郭 芮
最近,不止一次收到小伙伴的截图追问:
“这个图叫什么???”
“这个图真好看!!!怎么画啊?”
......
笔者本没有干货,问的人多了,也便有了干货。
此图姓桑名基,平素不喜露面。奈何天生丽质,偶有露面,必引众人围观。
时人有云:“桑基桑基,高贵美丽!”
桑基是何许图也?
据笔者不严谨的抽样提问统计,90%想学习桑基图的旁友,都是被她妖艳炫酷的外表所吸引。
而桑基图真正代表了什么?和类似图表相比的独特性是什么?却几乎无人问津。
害!人真的是视觉动物!
言归正传,我们来看看百科的官方解释:
桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。因1898年Matthew Henry Phineas Riall Sankey绘制的"蒸汽机的能源效率图"而闻名,此后便以其名字命名为"桑基图"。
Emmm,有点内个意思了,结合其他资料,做进一步的汇总提炼:
桑基两个字取自“发明”者的名字
属于流程图的一种,核心在于展示数据的流转
主要由节点、边和流量三要素构成,边越宽代表流量越大
遵循守恒定律,无论怎么流动,开端和末端数据总是一致的
文字太苍白,下面我们用Python来绘制一个具体的实例。
Python手把手绘制桑基图
动手之前,我们再次敲黑板,回顾桑基图组成要素的重点——节点、边和流量。
任何桑基图,无论展现形式如何夸张,色彩如何艳丽,动效如何炫酷,本质都逃不出上述3点。
只要我们定义好上述3个要素,Python的pyecharts库能够轻松实现桑基图的绘制。
这里我们用“当代青年熬夜原因分析”数据为例:
(数据来源:这个数据是笔者近两周卖炒粉时口头做的调研)
很规整的性别、熬夜原因、人数三列数据。
不过,要用pyecharts来画图,得入乡随俗,按照它定的规则来规整数据源。
首先是节点,这一步需要把所有涉及到的节点去重规整在一起。也就是要把性别一列的“男”、“女”和熬夜原因一列的“打游戏”、“加班”、“看剧”以列表内嵌套字典的形式去重汇总:
接着,定义边和流量,数据从哪里流向哪里,流量(值)是多少,循环+字典依然可以轻松搞定:
source-target-value的字典格式,很清晰的描述了数据的流转情况。
这两块数据准备完毕,桑基图已经完成了80%,剩下的20%,只是固定格式的绘图代码:
from pyecharts.charts import Sankey
from pyecharts import options as optspic = (Sankey().add('', #图例名称nodes, #传入节点数据linkes, #传入边和流量数据#设置透明度、弯曲度、颜色linestyle_opt=opts.LineStyleOpts(opacity = 0.3, curve = 0.5, color = "source"),#标签显示位置label_opts=opts.LabelOpts(position="right"),#节点之前的距离node_gap = 30,).set_global_opts(title_opts=opts.TitleOpts(title = '熬夜原因桑基图'))
)pic.render('test.html')
一个回车下去,看看成果:
果然,男打游戏女看剧,加班熬夜是儿戏。
如果想要垂直显示,只需要在add函数里面加一个orient="vertical"就好:
pic = (Sankey().add('',nodes,linkes,linestyle_opt=opts.LineStyleOpts(opacity = 0.3, curve = 0.5, color = "source"),label_opts=opts.LabelOpts(position="top"),node_gap = 30,orient="vertical", #更改的是这里).set_global_opts(title_opts=opts.TitleOpts(title = '熬夜原因细分桑基图'))
)pic.render('test2.html')
OK!不过,还有同学意犹未尽,这个是涉及到两层的流转,那如果三层,需要怎么画呢?
不慌,先导入(狗粮)数据:
这是某宠物品牌,3月份主要产品购买路径(第一次和第二次)的数据,先是品类,其次是第一次购买的产品类型,接着是第二次购买的产品类型,最后一列对应人数。
(注:这里第一次购买的产品前面加了“1-”,第二次购买加了“2-”的区分标识。)
画图必备的nodes节点实现很简单,所有节点(品类、第一次购买、第二次购买)做去重汇总,对上面生成nodes代码稍作调整就可以:
而linkes只接受source-traget-value的格式,得先对源数据进行格式调整,分别形成“品类-第一次购买-人数”,“第一次购买-第二次购买-人数”的样式,再统一汇总:
规整汇总好之后,只需要复用上面的linkes代码:
画图代码几乎没变,只是改了个标题:
pic = (Sankey().add('',nodes,linkes,linestyle_opt=opts.LineStyleOpts(opacity = 0.3, curve = 0.5, color = 'source'),label_opts=opts.LabelOpts(position = 'top'),node_gap = 30,).set_global_opts(title_opts=opts.TitleOpts(title = '客户购买路径流转图'))
)
pic.render('test3.html')
大功告成,So easy!无论是多少层数据的流转,只要定义好nodes和linkes,就能以不变应万变。
最后,通过上面的桑基图,我们能够非常直观的洞察到客户购买流转规律:
出于试错成本的考量,大部分客户第一次购买的是小规格狗粮。
第一次购买小规格狗粮的客户,流失(第二次未购买)情况严重,且再次购买客户,更倾向于继续选择小规格狗粮尝试,而不是信任性的购买大规格狗粮。
第一次购买大规格狗粮的客户,留存下来的客户已经建立起对品牌的信任感,再次购买大部分选择了大规格狗粮。
购买狗粮的客户第二次复购鲜有尝试玩具的,而第一次购买玩具的客户,也并未建立起对品牌狗粮的兴趣。
原本死板的数据,在桑基的装扮之下,变得楚楚动人。
作者:周志鹏,3年数据分析,深切感受到数据分析的有趣和学习过程中缺少案例的无奈,遂新开公众号「数据不吹牛」,定期更新数据分析相关技巧和有趣案例(含实战数据集),欢迎大家关注交流。
声明:本文为作者投稿,版权归其所有。
【End】
推荐阅读
☞154 万 AI 开发者用数据告诉你,中国 AI 如何才能弯道超车?| 中国 AI 应用开发者报告
☞暴风集团仅剩10余人;搜狗告百度输入法侵权案再驳回;Linux 5.6发布 | 极客头条
☞2019报告:AI程序员人才需求暴涨35倍!每10个公司就有6个人才缺口
☞大龄程序员都去哪?分享我身边的几个故事
☞Spark3.0发布了,代码拉过来,打个包,跑起来!| 附源码编译
☞业内最大的“空气币”——以太坊???
你点的每一个在看,我认真当成了喜欢
手把手教你用 Python 绘制酷炫的桑基图!相关推荐
- 用python画皇冠_手把手教你用 Python 绘制酷炫的桑基图!
原标题:手把手教你用 Python 绘制酷炫的桑基图! 作者 | 周志鹏 责编 | 郭 芮 最近,不止一次收到小伙伴的截图追问: "这个图叫什么???" "这个图真好看! ...
- python 桑基图 地理坐标_手把手教你用Python绘制酷炫的桑基图
最近 ,不止一次收到小伙伴的截图追问: "这个图叫什么 ? ? ?" "这个图真好看 ! ! !怎么画啊 ?" ...... 笔者本没有干货 ,问的人多了 ,也 ...
- python画图宽度_手把手教你用 Python 绘制酷炫的桑基图!
作者 | 周志鹏 责编 | 郭 芮 最近,不止一次收到小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?" ...... 笔者本没有 ...
- 如何利用pyecharts绘制酷炫的桑基图?
什么是桑基图 桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图.它是一种特定类型的流程图,核心在于展示数据的流转,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源.材 ...
- python画建筑分析图_教你用GH绘制酷炫的流线分析图 | 建筑学院
教你用GH绘制酷炫的流线分析图 重要声明:这篇教程纯粹为绘图方法的介绍,其中的"人流数据"为YY而来的伪数据,没有真实性及可参考性,不可以作为科研方法!请相关课题的研究者使用合理的 ...
- python画三维平面-Python 绘制酷炫的三维图步骤详解
通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...
- python画三维温度散点图-Python 绘制酷炫的三维图步骤详解
通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...
- python画三维散点图-Python 绘制酷炫的三维图步骤详解
通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...
- python画三维图-Python 绘制酷炫的三维图步骤详解
通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...
最新文章
- 巧用组策略关闭危险端口
- java-Java可以对方法进行序列化?
- Scala Actor,receive不断接收消息,react复用线程,结合case class的actor,Future使用,使用Actor进行wordCount
- GitHub图片无法显示
- 【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)
- 20220207-CTF-MISC-第11题--- base64隐写--附带脚本
- Could not autowire. No beans of 'xxxx' type found的错误提示
- 解决Android 输入法InputMethodService 显示时让原Activity大小计算错误问题
- 新建一个包,并生成可以直接在命令行执行的指令
- WinForm 实例教程 通讯录 视频教程 入门教程
- SDN驱动云数据中心的发展
- Vasp学习专题之软件的基本功能和使用
- vijos 1082
- android谷歌地图获取地址信息,java - 如何通过触摸Android谷歌地图上的屏幕获取地址信息 - SO中文参考 - www.soinside.com...
- Redis持久化数据之RDB和AOF
- 违反卖家评论政策被警告了应该怎么操作?
- 鸿蒙系统全球发布,鸿蒙系统正式发布,全球瞩目!
- PDF怎么转换成Excel?推荐几个PDF转excel的方法
- 洛谷 P3258 松鼠的新家 题解
- ubuntu 8.04 中文输入法 中文撑持
热门文章
- 推荐几家域名注册服务商 附个人意见
- 玩转spring boot——国际化
- explict关键字
- jqGrid与Struts2的结合应用(七) —— 浅谈排序
- Objective-c方法调用流程
- ubuntu 下 maven安装
- [Linux] 头文件加载顺序
- QPushButton的四个信号:pressed(),clicked(),released(),toggled()
- [论文阅读] Learning Without Forgetting
- Pytorch CUDA GPU运算模型训练缓慢的一个可能原因