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

Posted 不加班的程序员丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了清华学者用Python制作漂亮的流动桑基图相关的知识,希望对你有一定的参考价值。

桑基图绘制实践

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

  • 什么是桑基图

  • 官网的两个 demo

  • 桑基图绘制项目实战

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

图片

什么是桑基图?

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

图片

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

图片

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

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

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

官网demo

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

demo_1

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

图片

下面是最终的图形:

图片

demo_2

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

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

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

图片

桑基图绘制实践

原始数据整理

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

认识原始数据

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

  • 住宿

  • 餐饮

  • 交通

  • 服装

  • 红包

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

图片

分层级整理数据

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

图片

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

图片

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

图片

桑基图数据生成

读取数据

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

注意两点:

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

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

    1. 直接指定名字

    2. 指定该sheet_name的位置索引

图片

确定全部节点nodes

1、先找出全部的节点

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

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

图片

2、生成节点数据

图片

生成链路数据

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

图片

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

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

绘制桑基图

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

方式1

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

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

图片

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

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

以上是关于清华学者用Python制作漂亮的流动桑基图的主要内容,如果未能解决你的问题,请参考以下文章

Python 绘制惊艳的桑基图

如何使用 Plotly 制作简单的多级桑基图?

可视化应用案例Python绘制桑吉图

origin2017的桑基图在哪

可视化神器Plotly玩转桑基图

可视化应用实战案例:绘制交互式+pdf+png等多格式桑基图