python画简单图片-Python绘制“高颜值”桑基图
请看以下图片:
相信许多小伙伴第一眼就会被它美丽的外表所吸引,由此引发一连串的惊叹:
“这个图叫什么???”
“这个图真好看!!!怎么画啊?”
为了满足大家的好奇心,小编开始了对此图的解密。
此图姓桑名基,平素不喜露面。奈何天生丽质,偶有露面,必引众人围观。
时人有云:“桑基桑基,高贵美丽!”
一.桑基是何许图也
桑基图(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绘制“高颜值”桑基图相关推荐
- python画简单图片-Python 画个图
先放上最后的结果图(数据画的有点丑,随便看看就好了): 功能描述: 这个脚本主要的作用就是监视指定文件夹中(示例中在脚本所在文件夹下)指定文件这里就是csv文件中的数据做折线图:再将这一系列的图保存成 ...
- R语言多层桑基图_绘制炫酷桑基图,R语言(networkD3包)能搞定?
你知道如何使用R语言绘制桑基图吗? 小锐当然知道啦,并且教你 绘制酷炫的桑基图. 开课啦 桑基图(Sankey)是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,其最明显的特征就是,始末 ...
- 用python可以画的可爱的图形_利用Python绘制诱人的桑基图
作者:小z 来源:数据不吹牛 大家好,我是小z~ 最近,不止一次收到群里小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?" 小z本没有 ...
- 用python画太阳花原理_用Python绘制诱人的桑基图,一眼看透熬夜和狗粮的秘密
最近,不止一次收到群里小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?" 问的人多了,也便有了干货. 此图姓桑名基,平素不喜露面.奈何 ...
- 用Python绘制诱人的桑基图,一眼看透熬夜和狗粮的秘密...
↑ 关注 + 置顶 ~ 别错过小z的有趣内容 大家好,我是小z~ 最近,不止一次收到群里小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?&quo ...
- python怎么画简单图片-Python绘制简易的二维图像
大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...
- python怎么画简单图片-python中简单易学的绘图:用turtle画太极图
为什么想画太极图呢?因为我儿子不知道是看了哪本书还是哪个电视,竟然特地打印出一张太极图要挂在大门口,我赶紧说祖宗这挂在门外,别人看见了还以为咱家出什么事了,你喜欢就挂自己卧室门口吧,于是这张图就成了他 ...
- 简单python画圣诞树图片-python圣诞树代码
python圣诞树代码 1.简单的绘制圣诞树 新建tree1.py或者直接输入下面代码运行#声明树的高度 height = 5 #树的雪花数,初始为1 stars = 1 #以数的高度作为循环次数 f ...
- 简单python画圣诞树图片-python圣诞树编写实例详解
python圣诞树代码 1.简单的绘制圣诞树 新建tree1.py或者直接输入下面代码运行 #声明树的高度 height = 5 #树的雪花数,初始为1 stars = 1 #以数的高度作为循环次数 ...
最新文章
- 读书笔记:《HTML5开发手册》--figure、time、details、mark
- IE9上特定网站不断崩溃的故障
- Android拍照流程
- 为什么开源的代码没有注释_代码注释那些事儿
- Matlab常用图像操作
- Scipy教程 - 距离计算库scipy.spatial.distance
- Spring 基于注解的AOP实现
- 雷军说马云骗子、柳传志弃投百度、王兴骂滴滴垃圾…14位大佬悔不当初
- ie和火狐的兼容性问题
- python之OrderedDict类
- mongodb java 不等于_mongoDB在java上面的应用
- 网站微信扫码登录实现步骤
- NCC2105关于分管领导审批流设置另一方法
- Ipad2.4 9.3.5 降级8.4.1方法
- 如何让你自己做的网站他人可以访问——外网访问
- coco人体姿态估计标注软件
- ❤女朋友生日❤ HTML+css3+js 实现抖音炫酷樱花3D相册 (含背景音乐)程序员表白必备
- PLC数据采集有何难点?有什么解决方法?
- p37 p38 p39 p40 p41
- 笔记本电脑关上盖子锁定计算机,教大家笔记本电脑合上盖子后如何自动锁定电脑...
热门文章
- svn 不支持http 客户端_Xversion for mac(SVN客户端)
- android listview 不显示_ListView详细介绍与使用
- 开发日记-20190627 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 4
- 开发日记-20190407
- golomb哥伦布编码——本质上就是通过0来区分商和余数
- JS跨域访问(ajax跨域)
- BZOJ3992[SDOI2015]序列统计
- 【记录】 安装qflow on ubuntu 16.04
- Ubuntu中使用WPS
- 8.17——继续熟悉linux的命令行