Python图形之桑基图

工作过程中,上司曾经发了一个下面的图问是否可以做一个这样的图,当时刚刚培训完大数据的我四处询问童鞋也没有问出这个图到底怎么做,偶然的一天,在读公众号的时候看到了一篇用python画桑基图的文章,试了一下,果然可以画出桑基图,在这里整理了一下分享给大家.

桑基图

话说什么是桑基图呢?百度百科是这样描述的:

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

科普完毕,接下来,我们就实战一下,用python绘制一副桑基图吧,话说桑基图的组成要素有哪些呢,敲重点啦,桑基图的本质由节点,流量组成,万变不离其中.

制作桑基图

接下来我们用“创意李公馆在售产品”数据来举例:
首先整理基础数据

import  pandas as pd
df=pd.DataFrame({'类型':['遥控','遥控','遥控','非遥控','非遥控','非遥控'],'产品名称':['机器人','猛击赛车','莱肯赛车','机器人','猛击赛车','莱肯赛车'],'数量':[15,23,36,48,21,11]
})
print(df)

打印结果

类型 产品名称 数量
0 遥控 机器人 15
1 遥控 猛击赛车 23
2 遥控 莱肯赛车 36
3 非遥控 机器人 48
4 非遥控 猛击赛车 21
5 非遥控 莱肯赛车 11

接下来我们要用pyecharts来画图啦

第一步:节点

先把所有涉及到的节点去重规整到一起,即把“类型”列的“遥控”、“非遥控”和产品名称列中的“机器人”、“猛击赛车”、“莱肯赛车”以列表内嵌套字典的形式去重汇总:

nodes=[]
for i in range(2):vales=df.iloc[:,i].unique()for value in vales:dic={}dic['name']=valuenodes.append(dic)
print(nodes)

输出结果:

[{‘name’: ‘遥控’}, {‘name’: ‘非遥控’}, {‘name’: ‘机器人’}, {‘name’: ‘猛击赛车’}, {‘name’: ‘莱肯赛车’}]

第二步:定义边和流量

linkes=[]
for i in df.values:dic={}dic['source']=i[0]dic['target']=i[1]dic['value']=i[2]linkes.append(dic)

输出结果:

[{‘source’: ‘遥控’, ‘target’: ‘机器人’, ‘value’: 15},
{‘source’: ‘遥控’, ‘target’: ‘猛击赛车’, ‘value’: 23},
{‘source’: ‘遥控’, ‘target’: ‘莱肯赛车’, ‘value’: 36},
{‘source’: ‘非遥控’, ‘target’: ‘机器人’, ‘value’: 48},
{‘source’: ‘非遥控’, ‘target’: ‘猛击赛车’, ‘value’: 21},
{‘source’: ‘非遥控’, ‘target’: ‘莱肯赛车’, ‘value’: 11}]

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

第三步:敲出绘图代码

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')

打开生成的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='right'),#节点之间的距离node_gap=30,orient="vertical",#查看垂直图片的操作).set_global_opts(title_opts=opts.TitleOpts(title='创意李公馆产品分类图'))
)
pic.render('test.html')

结果展示:

当出现三级流转的时候怎么办呢?请继续往下看

第一步:准备数据

import  pandas as pd
df=pd.DataFrame({'产品名称':['机器人','猛击赛车','莱肯赛车','机器人','猛击赛车','莱肯赛车'],'第一次购买':['遥控机器人','遥控猛击赛车','遥控莱肯赛车','非遥控机器人','非遥控猛击赛车','非遥控莱肯赛车'],'第二次购买':['未购买','购买','未购买','购买','未购买','购买'],'数量':[12,23,45,32,11,12]
})
print(df)
产品名称 第一次购买 第二次购买 数量
0 机器人 遥控机器人 未购买 12
1 猛击赛车 遥控猛击赛车 购买 23
2 莱肯赛车 遥控莱肯赛车 未购买 45
3 机器人 非遥控机器人 购买 32
4 猛击赛车 非遥控猛击赛车 未购买 11
5 莱肯赛车 遥控莱肯赛车 购买 12

第二步:节点去重汇总,对上述nodes稍作修改

nodes=[]
for i in range(3):#修改处vales=df.iloc[:,i].unique()for value in vales:dic={}dic['name']=valuenodes.append(dic)
print(nodes)

打印结果:

[{‘name’: ‘机器人’}, {‘name’: ‘猛击赛车’}, {‘name’: ‘莱肯赛车’}, {‘name’: ‘遥控机器人’}, {‘name’: ‘遥控猛击赛车’}, {‘name’: ‘遥控莱肯赛车’}, {‘name’: ‘非遥控机器人’}, {‘name’: ‘非遥控猛击赛车’}, {‘name’: ‘非遥控莱肯赛车’}, {‘name’: ‘未购买’}, {‘name’: ‘购买’}]

第三步:因为linkes只接受source-traget-value的格式,所以得先形成“产品名称-第一次购买-数量”,“产品名称-第二次购买-数量”的样式,再统一汇总:

first=df.groupby(['产品名称','第一次购买'])['数量'].sum().reset_index()
second=df.iloc[:,1:]
first.columns=['source','target','value']
second.columns=['source','target','value']
result=pd.concat([first,second])
print(result.head(6))
source target value
0 机器人 遥控机器人 12
1 机器人 非遥控机器人 32
2 猛击赛车 遥控猛击赛车 23
3 猛击赛车 非遥控猛击赛车 11
4 莱肯赛车 遥控莱肯赛车 45
5 莱肯赛车 非遥控莱肯赛车 12

第四步:规整汇总好之后,复用上面的linkes代码

linkes=[]
for i in result.values:dic={}dic['source']=i[0]dic['target']=i[1]dic['value']=i[2]linkes.append(dic)

打印结果:

[{‘source’: ‘机器人’, ‘target’: ‘遥控机器人’, ‘value’: 12},
{‘source’: ‘机器人’, ‘target’: ‘非遥控机器人’, ‘value’: 32},
{‘source’: ‘猛击赛车’, ‘target’: ‘遥控猛击赛车’, ‘value’: 23},
{‘source’: ‘猛击赛车’, ‘target’: ‘非遥控猛击赛车’, ‘value’: 11},
{‘source’: ‘莱肯赛车’, ‘target’: ‘遥控莱肯赛车’, ‘value’: 45},
{‘source’: ‘莱肯赛车’, ‘target’: ‘非遥控莱肯赛车’, ‘value’: 12},
{‘source’: ‘遥控机器人’, ‘target’: ‘未购买’, ‘value’: 12},
{‘source’: ‘遥控猛击赛车’, ‘target’: ‘购买’, ‘value’: 23},
{‘source’: ‘遥控莱肯赛车’, ‘target’: ‘未购买’, ‘value’: 45},
{‘source’: ‘非遥控机器人’, ‘target’: ‘购买’, ‘value’: 32},
{‘source’: ‘非遥控猛击赛车’, ‘target’: ‘未购买’, ‘value’: 11},
{‘source’: ‘非遥控莱肯赛车’, ‘target’: ‘购买’, ‘value’: 12}]

第五步:输入画图代码

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,#orient="vertical",#查看垂直图片的操作).set_global_opts(title_opts=opts.TitleOpts(title='创意李公馆产品分类图'))
)
pic.render('test.html')

大功搞成,看看输出成果吧

最后的最后,让我们来看看本次分析的主角吧
XB-21001猛击遥控赛车

遥控地平线号机器人
喜欢的小伙伴用淘宝扫描下方二维码进店查看详情哦

Python图形系列之桑基图相关推荐

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

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

  2. 生信常用分析图形绘制04 -- 桑基图

    有了R语言的基础,以及ggplot2绘图基础,我们的生信常用分析图形的绘制就可以提上日程了!本系列,师兄就开始带着大家一起学习如何用R语言绘制我们自己的各种分析图吧! 由于本系列的所有分析代码均为师兄 ...

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

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

  4. python 桑基图_3行代码基于python的matplotlib绘制桑基图

    背景 桑基图作为1种表达数据流动方向的可视化方式,在商业数据分析,地理可视化,生物医学领域有着广泛应用.比如:在基因组学领域,有研究利用桑基图来表示生物分子之间的调控关系. 目前多数桑基图软件包(如p ...

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

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

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

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

  7. Python绘制桑基图

    很多时候,我们需要一种必须可视化数据如何在实体之间流动的情况.例如,以居民如何从一个国家迁移到另一个国家为例.这里演示了有多少居民从英格兰迁移到北爱尔兰.苏格兰和威尔士. 桑基图简介 从这个 桑基图 ...

  8. 【Python 】绘制惊艳的桑基图

    很多时候,我们需要一种必须可视化数据如何在实体之间流动的情况.例如,以居民如何从一个国家迁移到另一个国家为例.这里演示了有多少居民从英格兰迁移到北爱尔兰.苏格兰和威尔士. 从这个 桑基图 (Sanke ...

  9. 数据治理 Python桑基图处理表关系

    数据治理 Python桑基图处理表关系 需求 随着hive库表越来越多,调度出问题后,排查时间越来越长.计划通过桑基图以及血缘图谱解决,当前先用桑基图页面顶一段时间.后期做成web服务,如果有可能,尽 ...

最新文章

  1. 从中心走向边缘——深度解析云原生边缘计算落地痛点
  2. DCMTK:表示基于文件系统的基本工作列表管理服务类提供程序的控制台引擎的类
  3. 【ArcGIS微课1000例】0011:ArcGIS空间查询(按位置选择Select by Location)完全案例详解
  4. 200多个js技巧代码(五)
  5. JupyterHub on Kubernetes-Helm安装
  6. PHP中基本符号及使用方法
  7. Firefox 37原生支持HTML5视频回放功能
  8. ubuntu下C语言打开bmp图像文件并读取数据
  9. 分享几个java小程序代码
  10. BackTrack4——利用***测试保证系统安全
  11. Pick定理 有趣的证明
  12. Excel批注教学:一键添加多个不同批注
  13. bootstrap-select学习基础示例
  14. 深度学习技术在股票交易上的应用研究调查
  15. 【人脸识别(三)】:使用face_recognition库实现人脸识别,python实现
  16. 过亿海量数据处理分析
  17. 模型稳定度指标PSI与IV
  18. AVS3变换系数编码:SRCC
  19. 【软件全称】图书管理系统
  20. MSN登陆不上去的解决方法

热门文章

  1. 快捷键-Windows快捷键
  2. 苹果公司的创始人_如果拥有苹果公司10%的股份,能成为世界首富吗?
  3. 2019年6月数据库流行度排行榜出炉
  4. springboot毕设项目小区废弃物分类管理系统cf53s(java+VUE+Mybatis+Maven+Mysql)
  5. [零刻]EQ12EQ12Po安装Esxi后提示TPM无法建立连接,彻底关闭提示教程
  6. 《Python语言程序设计》王恺 王志 机械工业出版社 第四章 面向对象 课后习题答案
  7. 免签出国,我们这些懒人的长假有救了
  8. 计算机是如何识别内核态和用户态,用户态和内核态区分(二十七)
  9. 借道大数据 互联网基金再探“蓝海”
  10. 有源淹没分析arcgis_洪涝有源淹没算法及淹没结果分析