请看以下图片:

相信许多小伙伴第一眼就会被它美丽的外表所吸引,由此引发一连串的惊叹:

“这个图叫什么???”

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

为了满足大家的好奇心,小编开始了对此图的解密。

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

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

一.桑基是何许图也

桑基图(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 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

End.

作者:小z

来源:数据不吹牛

本文已和作者授权,如需转载请与作者联系

python画简单图片-Python绘制“高颜值”桑基图相关推荐

  1. python画简单图片-Python 画个图

    先放上最后的结果图(数据画的有点丑,随便看看就好了): 功能描述: 这个脚本主要的作用就是监视指定文件夹中(示例中在脚本所在文件夹下)指定文件这里就是csv文件中的数据做折线图:再将这一系列的图保存成 ...

  2. R语言多层桑基图_绘制炫酷桑基图,R语言(networkD3包)能搞定?

    你知道如何使用R语言绘制桑基图吗? 小锐当然知道啦,并且教你 绘制酷炫的桑基图. 开课啦 桑基图(Sankey)是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,其最明显的特征就是,始末 ...

  3. 用python可以画的可爱的图形_利用Python绘制诱人的桑基图

    作者:小z 来源:数据不吹牛 大家好,我是小z~ 最近,不止一次收到群里小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?" 小z本没有 ...

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

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

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

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

  6. python怎么画简单图片-Python绘制简易的二维图像

    大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...

  7. python怎么画简单图片-python中简单易学的绘图:用turtle画太极图

    为什么想画太极图呢?因为我儿子不知道是看了哪本书还是哪个电视,竟然特地打印出一张太极图要挂在大门口,我赶紧说祖宗这挂在门外,别人看见了还以为咱家出什么事了,你喜欢就挂自己卧室门口吧,于是这张图就成了他 ...

  8. 简单python画圣诞树图片-python圣诞树代码

    python圣诞树代码 1.简单的绘制圣诞树 新建tree1.py或者直接输入下面代码运行#声明树的高度 height = 5 #树的雪花数,初始为1 stars = 1 #以数的高度作为循环次数 f ...

  9. 简单python画圣诞树图片-python圣诞树编写实例详解

    python圣诞树代码 1.简单的绘制圣诞树 新建tree1.py或者直接输入下面代码运行 #声明树的高度 height = 5 #树的雪花数,初始为1 stars = 1 #以数的高度作为循环次数 ...

最新文章

  1. 读书笔记:《HTML5开发手册》--figure、time、details、mark
  2. IE9上特定网站不断崩溃的故障
  3. Android拍照流程
  4. 为什么开源的代码没有注释_代码注释那些事儿
  5. Matlab常用图像操作
  6. Scipy教程 - 距离计算库scipy.spatial.distance
  7. Spring 基于注解的AOP实现
  8. 雷军说马云骗子、柳传志弃投百度、王兴骂滴滴垃圾…14位大佬悔不当初
  9. ie和火狐的兼容性问题
  10. python之OrderedDict类
  11. mongodb java 不等于_mongoDB在java上面的应用
  12. 网站微信扫码登录实现步骤
  13. NCC2105关于分管领导审批流设置另一方法
  14. Ipad2.4 9.3.5 降级8.4.1方法
  15. 如何让你自己做的网站他人可以访问——外网访问
  16. coco人体姿态估计标注软件
  17. ❤女朋友生日❤ HTML+css3+js 实现抖音炫酷樱花3D相册 (含背景音乐)程序员表白必备
  18. PLC数据采集有何难点?有什么解决方法?
  19. p37 p38 p39 p40 p41
  20. 笔记本电脑关上盖子锁定计算机,教大家笔记本电脑合上盖子后如何自动锁定电脑...

热门文章

  1. svn 不支持http 客户端_Xversion for mac(SVN客户端)
  2. android listview 不显示_ListView详细介绍与使用
  3. 开发日记-20190627 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 4
  4. 开发日记-20190407
  5. golomb哥伦布编码——本质上就是通过0来区分商和余数
  6. JS跨域访问(ajax跨域)
  7. BZOJ3992[SDOI2015]序列统计
  8. 【记录】 安装qflow on ubuntu 16.04
  9. Ubuntu中使用WPS
  10. 8.17——继续熟悉linux的命令行