清华学者用Python制作漂亮的流动桑基图

桑基图绘制实践

本文中介绍的是如何制作桑基图,使用的可视化库是强大的 Pyecharts (版本1.7.1,版本一致很重要)。文章将从如下几个方面进行介绍:

  • 什么是桑基图

  • 官网的两个 demo

  • 桑基图绘制项目实战

在开始之前,我们先来看看通过本文制作的最终效果图:

清华学者用Python制作漂亮的流动桑基图_第1张图片

什么是桑基图?

桑基图(桑葚图),也叫桑基能量分流图或者桑基能量平衡图,里面的桑基其实是一个人名,全名是 马修·亨利·菲尼亚斯·里尔·桑基(Matthew Henry Phineas Riall Sankey) ,是一名爱尔兰裔工程师,也是英国皇家陆军工兵的上尉[1]。

清华学者用Python制作漂亮的流动桑基图_第2张图片

早在 1898 年的时候,他就使用这种图形来表示蒸汽机的能源效率:

清华学者用Python制作漂亮的流动桑基图_第3张图片

桑基之后,桑基图逐渐成为科学和工程领域,代表平衡、能量流、物质流的标准模型,在一些产品的生命周期评估中也常被使用,通常应用于能源、材料成分、金融等数据的可视化分析。主要特点是:

  • 图形由边、流量和支点组成。边代表了流动的数据,流量代表了流动数据的具体数值,节点代表了不同分类

  • 始末端的分支宽度总和相等,即所有主支宽度的总和应与所有分出去的分支宽度的总和相等,保持能量的平衡。

官网demo

本文中使用的Pyecharts版本是1.7.1,版本的一致非常重要。

清华学者用Python制作漂亮的流动桑基图_第4张图片

demo_1

首先我们看看官网的第一个demo

清华学者用Python制作漂亮的流动桑基图_第5张图片

清华学者用Python制作漂亮的流动桑基图_第6张图片

下面是最终的图形:

清华学者用Python制作漂亮的流动桑基图_第7张图片

demo_2

接下来我们看看官网的第二个demo

清华学者用Python制作漂亮的流动桑基图_第8张图片

  • 读取本地的json数据,通过josn.load()读取转成Python字典

  • 取出json数据中的节点和链路数据进行绘图

清华学者用Python制作漂亮的流动桑基图_第9张图片

桑基图绘制实践

原始数据整理

通过上面官网的例子我们明白了绘制桑基图需要的两个数据:节点数据+链路数据,下面通过一个实际的案例来讲解如何生成绘制桑基图需要的数据

认识原始数据

Peter同学一个人在深圳搬砖,辛辛苦苦地搬了一个月,产生很多的开销,这些开支主要分成5大块:

  • 住宿

  • 餐饮

  • 交通

  • 服装

  • 红包

每个部分又分别有不同的去向,所以这些数据就自然构成了一条条的链路,比如:总费用—住宿—房租(2000)总费用—交通—滴滴(220)等,我们只考虑两个节点之间的关系

清华学者用Python制作漂亮的流动桑基图_第10张图片

分层级整理数据

1、接下来我们分不同的层级来整理原始数据,首先是第一层:总费用到5个子版块。算出每个子版块的总和

清华学者用Python制作漂亮的流动桑基图_第11张图片

2、整理5个子版块的数据

清华学者用Python制作漂亮的流动桑基图_第12张图片

3、我们将上面两个步骤得到的数据放入一个sheet中,命名为开支

清华学者用Python制作漂亮的流动桑基图_第13张图片

桑基图数据生成

读取数据

首先我们将上面制作好的开支这份数据读到pandas中:

清华学者用Python制作漂亮的流动桑基图_第14张图片

注意两点:

  1. 当一个表格中存在多个sheet的时候,我们需要指定sheet_name的名字

  2. 指定sheet_name的名字有两种方式:

    1. 直接指定名字

    2. 指定该sheet_name的位置索引

清华学者用Python制作漂亮的流动桑基图_第15张图片

确定全部节点nodes

1、先找出全部的节点

所有的节点数据就是上面的父类和子类中去重后的元素,我们使用集合set进行去重,再转成列表

清华学者用Python制作漂亮的流动桑基图_第16张图片

将上面的数据相加并且去重:

清华学者用Python制作漂亮的流动桑基图_第17张图片

清华学者用Python制作漂亮的流动桑基图_第18张图片

2、生成节点数据

清华学者用Python制作漂亮的流动桑基图_第19张图片

清华学者用Python制作漂亮的流动桑基图_第20张图片

生成链路数据

我们将导入的数据生成链路数据:每一行记录都是一个链路数据:

清华学者用Python制作漂亮的流动桑基图_第21张图片

清华学者用Python制作漂亮的流动桑基图_第22张图片

Attention⚠️:导入的数据部分需要强制转换成int类型,防止后面的数据处理报错。

到此为止,我们已经完成了桑葚图中节点数据和链路数据的生成,下面开始绘图。

绘制桑基图

我们通过官网的2种不同方式来绘制桑基图

方式1

这种方式比较简单:直接将上面得到的nodes_listlinks_list整体放入绘图的代码中:

清华学者用Python制作漂亮的流动桑基图_第23张图片

清华学者用Python制作漂亮的流动桑基图_第24张图片

得到的桑基图在notebook中是动态的图形:

清华学者用Python制作漂亮的流动桑基图_第25张图片

动态视频效果如下:由于系统原因,无法上传视频,就上传个截图了

清华学者用Python制作漂亮的流动桑基图_第26张图片

需要相关资料的可以扫一扫备注【python资料】

清华学者用Python制作漂亮的流动桑基图_第27张图片

你可能感兴趣的:(python,django,spring,swoole,ruby)