本文中介绍的是如何制作桑基图,使用的可视化库是强大的 Pyecharts
(版本1.7.1,版本一致很重要)。文章将从如下几个方面进行介绍:
什么是桑基图
官网的两个 demo
桑基图绘制项目实战
在开始之前,我们先来看看通过本文制作的最终效果图:
桑基图(桑葚图),也叫桑基能量分流图或者桑基能量平衡图,里面的桑基其实是一个人名,全名是 马修·亨利·菲尼亚斯·里尔·桑基(Matthew Henry Phineas Riall Sankey)
,是一名爱尔兰裔工程师,也是英国皇家陆军工兵的上尉[1]。
早在 1898 年的时候,他就使用这种图形来表示蒸汽机的能源效率:
桑基之后,桑基图逐渐成为科学和工程领域,代表平衡、能量流、物质流的标准模型,在一些产品的生命周期评估中也常被使用,通常应用于能源、材料成分、金融等数据的可视化分析。主要特点是:
图形由边、流量和支点组成。边代表了流动的数据,流量代表了流动数据的具体数值,节点代表了不同分类
始末端的分支宽度总和相等,即所有主支宽度的总和应与所有分出去的分支宽度的总和相等,保持能量的平衡。
本文中使用的Pyecharts
版本是1.7.1
,版本的一致非常重要。
首先我们看看官网的第一个demo
:
下面是最终的图形:
接下来我们看看官网的第二个demo
:
读取本地的json
数据,通过josn.load()
读取转成Python
字典
取出json
数据中的节点和链路数据进行绘图
通过上面官网的例子我们明白了绘制桑基图需要的两个数据:节点数据+链路数据,下面通过一个实际的案例来讲解如何生成绘制桑基图需要的数据
认识原始数据
Peter同学一个人在深圳搬砖,辛辛苦苦地搬了一个月,产生很多的开销,这些开支主要分成5大块:
住宿
餐饮
交通
服装
红包
每个部分又分别有不同的去向,所以这些数据就自然构成了一条条的链路,比如:总费用—住宿—房租(2000)
,总费用—交通—滴滴(220)
等,我们只考虑两个节点之间的关系
分层级整理数据
1、接下来我们分不同的层级来整理原始数据,首先是第一层:总费用到5个子版块。算出每个子版块的总和
2、整理5个子版块的数据
3、我们将上面两个步骤得到的数据放入一个sheet
中,命名为开支
:
读取数据
首先我们将上面制作好的开支这份数据读到pandas中:
注意两点:
当一个表格中存在多个sheet
的时候,我们需要指定sheet_name
的名字
指定sheet_name
的名字有两种方式:
直接指定名字
指定该sheet_name
的位置索引
确定全部节点nodes
1、先找出全部的节点
所有的节点数据就是上面的父类和子类中去重后的元素,我们使用集合set
进行去重,再转成列表
将上面的数据相加并且去重:
2、生成节点数据
生成链路数据
我们将导入的数据生成链路数据:每一行记录都是一个链路数据:
Attention⚠️:导入的数据部分需要强制转换成int
类型,防止后面的数据处理报错。
到此为止,我们已经完成了桑葚图中节点数据和链路数据的生成,下面开始绘图。
我们通过官网的2种不同方式来绘制桑基图
方式1
这种方式比较简单:直接将上面得到的nodes_list
和links_list
整体放入绘图的代码中:
得到的桑基图在notebook
中是动态的图形:
动态视频效果如下:由于系统原因,无法上传视频,就上传个截图了