作者:小z

来源:数据不吹牛

大家好,我是小z~

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

“这个图叫什么???”

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

小z本没有干货,问的人多了,也便有了干货。

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

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

桑基是何许图也

据小z不严谨的抽样提问统计,90%想学习桑基图的旁友,都是被她妖艳炫酷的外表所吸引。

而桑基图真正代表了什么?和类似图表相比的独特性是什么?却几乎无人问津。

害!人真的是视觉动物!

言归正传,我们来看看百科的官方解释:

桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。因1898年Matthew Henry Phineas Riall Sankey绘制的"蒸汽机的能源效率图"而闻名,此后便以其名字命名为"桑基图"。

Emmm,有点内个意思了,结合其他资料,做进一步的汇总提炼:

桑基两个字取自“发明”者的名字

属于流程图的一种,核心在于展示数据的流转

主要由节点、边和流量三要素构成,边越宽代表流量越大

遵循守恒定律,无论怎么流动,开端和末端数据总是一致的

文字太苍白,下面我们用Python来绘制一个具体的实例~

Python手把手绘制桑基图

动手之前,我们再次敲黑板,回顾桑基图组成要素的重点——节点、边和流量。

任何桑基图,无论展现形式如何夸张,色彩如何艳丽,动效如何炫酷,本质都逃不出上述3点。

只要我们定义好上述3个要素,Python的pyecharts库能够轻松实现桑基图的绘制。

这里我们用“当代青年熬夜原因分析”数据为例:

数据来源:这个数据是小z近两周卖炒粉时口头做的调研

很规整的性别、熬夜原因、人数三列数据。

不过,要用pyecharts来画图,得入乡随俗,按照它定的规则来规整数据源。

首先是节点,这一步需要把所有涉及到的节点去重规整在一起。也就是要把性别一列的“男”、“女”和熬夜原因一列的“打游戏”、“加班”、“看剧”以列表内嵌套字典的形式去重汇总:

接着,定义边和流量,数据从哪里流向哪里,流量(值)是多少,循环+字典依然可以轻松搞定:

source-target-value的字典格式,很清晰的描述了数据的流转情况。

这两块数据准备完毕,桑基图已经完成了80%,剩下的20%,只是固定格式的绘图代码:

from pyecharts.charts import Sankey

from pyecharts import options as opts

pic = (

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,就能以不变应万变。

最后,通过上面的桑基图,我们能够非常直观的洞察到客户购买流转规律:

出于试错成本的考量,大部分客户第一次购买的是小规格狗粮。

第一次购买小规格狗粮的客户,流失(第二次未购买)情况严重,且再次购买客户,更倾向于继续选择小规格狗粮尝试,而不是信任性的购买大规格狗粮。

第一次购买大规格狗粮的客户,留存下来的客户已经建立起对品牌的信任感,再次购买大部分选择了大规格狗粮。

购买狗粮的客户第二次复购鲜有尝试玩具的,而第一次购买玩具的客户,也并未建立起对品牌狗粮的兴趣。

原本死板的数据,在桑基的装扮之下,变得楚楚动人。

注:相关数据源和代码,已经规整好,公众号后台回复“桑基图”即可获取。

参考来源:pyecharts官方文档

百度百科

朱卫军:公众号《python大数据分析》

镝数dydata.io

经济学人:www.economist.com

◆◆◆  ◆◆

长按二维码关注我们

数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:

猜你喜欢

用python可以画的可爱的图形_利用Python绘制诱人的桑基图相关推荐

  1. 用python可以画的可爱的图形_用Python的Turtple画图形

    不知道各位是否还记得在小学或者初中的时候,我们接触过一种语言叫做logo语言,这个语言可以画正方形,画三角形,画圆.而用Python画图形也有点类似logo语言的意思. 在画图之前,我们需要启动一个模 ...

  2. 用python画太阳花原理_用Python绘制诱人的桑基图,一眼看透熬夜和狗粮的秘密

    最近,不止一次收到群里小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?" 问的人多了,也便有了干货. 此图姓桑名基,平素不喜露面.奈何 ...

  3. 用Python绘制诱人的桑基图,一眼看透熬夜和狗粮的秘密...

    ↑ 关注 + 置顶 ~ 别错过小z的有趣内容 大家好,我是小z~ 最近,不止一次收到群里小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?&quo ...

  4. python怎么画出圆润的曲线_利用python画出AUC曲线的实例

    以load_breast_cancer数据集为例,模型细节不重要,重点是画AUC的代码. 直接上代码: from sklearn.datasets import load_breast_cancer ...

  5. python画简单图片-Python绘制“高颜值”桑基图

    请看以下图片: 相信许多小伙伴第一眼就会被它美丽的外表所吸引,由此引发一连串的惊叹: "这个图叫什么???" "这个图真好看!!!怎么画啊?" 为了满足大家的好 ...

  6. python画二维温度云图_利用python画出词云图

    本文将介绍如何利用python中相应的模块画出词云图.首先给出效果图: 其中词云图中的词汇是对手机短信中的垃圾短信的统计,字体越大表示在垃圾短信中出现的频次越高.下面给出具体的步骤. 读取" ...

  7. python代码画小猪佩奇动画片全集_使用python画个小猪佩奇的示例代码

    本文给大家较详细的介绍了使用python画个小猪佩奇的示例代码,感兴趣的朋友一起看看吧 基本原理 选好画板大小,设置好画笔颜色.粗细,定位好位置,依次画鼻子.头.耳朵.眼睛.腮.嘴.身体.手脚.尾巴, ...

  8. python自动化测试脚本可以测php吗_利用Python语言实现实验室自动化

    作为一名系统和应用工程师,得益于自动化仪器和软件,我已经节省了不计其数的日日夜夜;例如LabVIEW,这是一款系统设计平台和开发环境,支持可视化编程语言.LabVIEW支持用户利用友好的图形用户界面( ...

  9. python对数据进行合并的函数_利用Python pandas对Excel进行合并的方法示例

    前言 在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下. 博主也是新手一枚,代码肯定有很多需要优化的地方,欢迎各位大 ...

最新文章

  1. 一份来自贾扬清的AI修炼指南:不存在算法工程师,调参侠没有市场
  2. 【opus源码分析】【互相关函数源码分析】xcorr_kernal_c
  3. Swift3.0语言教程字符串与文件的数据转换
  4. 三问TDD: 单元测试总是好的吗?
  5. 双十一 手淘技术用了这几招
  6. 阐述简称PO,VO,TO,BO,DAO,POJO
  7. C语言 堆内存操作
  8. 哪些事情瞬间暴露了你的贫穷?
  9. 有很帅气的微信头像推荐吗?
  10. 解决Windows 2000起动时“NTLDR is missing”故障
  11. IOS contentOffset该如何理解
  12. 【QGIS】【OsGeo4w】安装方法
  13. 国内常见的14款低代码平台介绍
  14. XCodeGhost 病毒检查方法
  15. 数据分析之客户价值模型(RFM)技术总结
  16. 垃圾小白羊leetcode刷题记录1
  17. android wifi 移植记录
  18. PHP文案馆头像壁纸小程序源码独立后台
  19. 知识:ubuntu硬盘挂载详细步骤:
  20. Vuex状态刷新状态丢失的处理方法

热门文章

  1. 索引-jquery-第二版-pyhui
  2. Promise源码学习(2)
  3. 如何成为一名架构师,架构师成长之路(转)
  4. [置顶]别羡慕别人的舒服,静下心来坚持奋斗!!!
  5. Oracle 12.1.0.1 GI+DATABASE打PSU
  6. ThinkPHP的增、删、改、查
  7. php使用http请求头实现文件下载
  8. 我们真正需要的目标(原名:制定目标你会吗?)
  9. extjs 中登录保存用户名
  10. 利用 Caddy 轻松实现反向代理/镜像(支持自签SSL证书)