作者 | 周志鹏

责编 | 郭   芮

最近,不止一次收到小伙伴的截图追问:

“这个图叫什么???”

“这个图真好看!!!怎么画啊?”

......

笔者本没有干货,问的人多了,也便有了干货。

此图姓桑名基,平素不喜露面。奈何天生丽质,偶有露面,必引众人围观。

时人有云:“桑基桑基,高贵美丽!”

桑基是何许图也?

据笔者不严谨的抽样提问统计,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 绘制酷炫的桑基图!相关推荐

  1. 用python画皇冠_手把手教你用 Python 绘制酷炫的桑基图!

    原标题:手把手教你用 Python 绘制酷炫的桑基图! 作者 | 周志鹏 责编 | 郭 芮 最近,不止一次收到小伙伴的截图追问: "这个图叫什么???" "这个图真好看! ...

  2. python 桑基图 地理坐标_手把手教你用Python绘制酷炫的桑基图

    最近 ,不止一次收到小伙伴的截图追问: "这个图叫什么 ? ? ?" "这个图真好看 ! ! !怎么画啊 ?" ...... 笔者本没有干货 ,问的人多了 ,也 ...

  3. python画图宽度_手把手教你用 Python 绘制酷炫的桑基图!

    作者 | 周志鹏 责编 | 郭   芮 最近,不止一次收到小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?" ...... 笔者本没有 ...

  4. 如何利用pyecharts绘制酷炫的桑基图?

    什么是桑基图 桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图.它是一种特定类型的流程图,核心在于展示数据的流转,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源.材 ...

  5. python画建筑分析图_教你用GH绘制酷炫的流线分析图 | 建筑学院

    教你用GH绘制酷炫的流线分析图 重要声明:这篇教程纯粹为绘图方法的介绍,其中的"人流数据"为YY而来的伪数据,没有真实性及可参考性,不可以作为科研方法!请相关课题的研究者使用合理的 ...

  6. python画三维平面-Python 绘制酷炫的三维图步骤详解

    通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...

  7. python画三维温度散点图-Python 绘制酷炫的三维图步骤详解

    通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...

  8. python画三维散点图-Python 绘制酷炫的三维图步骤详解

    通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...

  9. python画三维图-Python 绘制酷炫的三维图步骤详解

    通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...

最新文章

  1. 巧用组策略关闭危险端口
  2. java-Java可以对方法进行序列化?
  3. Scala Actor,receive不断接收消息,react复用线程,结合case class的actor,Future使用,使用Actor进行wordCount
  4. GitHub图片无法显示
  5. 【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)
  6. 20220207-CTF-MISC-第11题--- base64隐写--附带脚本
  7. Could not autowire. No beans of 'xxxx' type found的错误提示
  8. 解决Android 输入法InputMethodService 显示时让原Activity大小计算错误问题
  9. 新建一个包,并生成可以直接在命令行执行的指令
  10. WinForm 实例教程 通讯录 视频教程 入门教程
  11. SDN驱动云数据中心的发展
  12. Vasp学习专题之软件的基本功能和使用
  13. vijos 1082
  14. android谷歌地图获取地址信息,java - 如何通过触摸Android谷歌地图上的屏幕获取地址信息 - SO中文参考 - www.soinside.com...
  15. Redis持久化数据之RDB和AOF
  16. 违反卖家评论政策被警告了应该怎么操作?
  17. 鸿蒙系统全球发布,鸿蒙系统正式发布,全球瞩目!
  18. PDF怎么转换成Excel?推荐几个PDF转excel的方法
  19. 洛谷 P3258 松鼠的新家 题解
  20. ubuntu 8.04 中文输入法 中文撑持

热门文章

  1. 推荐几家域名注册服务商 附个人意见
  2. 玩转spring boot——国际化
  3. explict关键字
  4. jqGrid与Struts2的结合应用(七) —— 浅谈排序
  5. Objective-c方法调用流程
  6. ubuntu 下 maven安装
  7. [Linux] 头文件加载顺序
  8. QPushButton的四个信号:pressed(),clicked(),released(),toggled()
  9. [论文阅读] Learning Without Forgetting
  10. Pytorch CUDA GPU运算模型训练缓慢的一个可能原因