查看原文
其他

数据呈现丨Python绘制桑基图,流量分析不用愁

威武哥 数据Seminar 2021-06-03

桑基图 (Sankey Diagram),是一种特定类型的流程图,用于描述一组值到另一组值的流向,也称为桑基能量分流图或桑基能量平衡图。下图即为桑基图的一个经典案例:1869年,Charles Minard 绘制的1812年拿破仑征俄图(Map of Napolean's Russian Campaign of 1812)。
具体来说,桑基图具有如下特点:

1、起始流量和结束流量相同,所有主支宽度的总和与所有分出去的分支宽度总和相等,保持能量的平衡;

2、在内部,不同的线条代表了不同的流量分流情况,它的宽度成比例地显示此分支占有的流量;

3、节点不同的宽度代表了特定状态下的流量大小。

这表明了绘制桑基图有一个重要的前提,即需要保持能量守恒,不能在中间过程创造或损耗流量。当然,如果不满足这个条件,需要改变边的宽度的话,我们推荐使用和弦图点此回顾R绘制和弦图)。

关于桑基图的扩展阅读:http://ecowest.org/2013/05/06/sankey-energy/

为了方便学习桑基图的绘制方法,下面以全国各省市2018年 GDP 数据进行展示,使用工具为 Python 绘图包pyecharts。




经济数据


首先从国家统计局(http://data.stats.gov.cn/easyquery.htm?cn=E0103)下载各地区生产总值,数据如下所示:

按照我国的地理区域划分,进一步对数据进行处理,将全国各省市分为七大地理地区,分别为:
华北地区:北京市,天津市,山西省,河北省,内蒙古自治区
东北地区:黑龙江省,吉林省,辽宁省
华东地区:上海市,江苏省,浙江省,安徽省,福建省,江西省,山东省(台湾省不在此次绘制范围内)
华中地区河南省,湖北省,湖南省
华南地区广东省,海南省,广西壮族自治区(香港、澳门不在此次绘制范围内)
西南地区:重庆市,四川省,贵州省,云南省,西藏自治区
西北地区:陕西省,甘肃省,青海省,宁夏回族自治区,新疆维吾尔自治区
经处理后的数据形式为:

当然,上述这种形式的表格还是不利于我们绘制桑基图,我们还需将其转化成以下形式:
到这里,我们就可以开始作图了。




制图代码


在绘制图形前,需要了解桑基图的两个概念,一个是所有类别的集合,称之为 nodes,一个是子类、父类、数据的三方集合,称之为 links。在具体绘制前,我们需要将上述数据处理成 Pyecharts 可以识别的 nodes 和 links 数据格式。下面给出具体代码:
  • 生成 nodes 代码
nodes = []for i in data[0].unique(): dic = {}    dic['name'] = i    nodes.append(dic)

左右滑动查看更多

  • 生成 links 代码

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

左右滑动查看更多

在取得绘制桑基图必须的数据后,我们就可以直接利用 pyecharts 进行绘图了
c = ( Sankey() .add("各地区GDP(亿元)" ,nodes ,links ,linestyle_opt=opts.LineStyleOpts(opacity = 0.4 , curve = 0.5 , color="source"                                                          ,type_="dotted"),  label_opts=opts.LabelOpts(position="right",), ) .set_global_opts(title_opts=opts.TitleOpts(title="全国各地区GDP桑基图")) ) c.render('Sankey_GDP.html') # 结果可在电脑工作路径中找到
左右滑动查看更多




图形展示


绘制的成型图如下所示,你可以将鼠标放置在图形任何位置,相应的会显示出各自数据,你甚至可以拖动数据条,以你自己觉得好看的组合方式进行排列,操作方式只需点击图形两边的方块。




图形解读


针对上面全国各地区GDP桑基图,我们可以清楚的得到以下三点结论:

1、从省市角度看,广东省、江苏省、山东省的线条最宽,表明其2018年的GDP体量最高,对我国的GDP贡献值最大;

2、从区域角度看,华东地区是我国经济最为繁荣的区域,华北、华中、华南地区次之,西南、东北、西北地区较为落后;

3、从各自区域贡献角度看,华东地区各省份呈明显的梯度差异,华南地区则广东省一家独大,其余地区各省市贡献度整体差异不大。




附录:

1、上图完整代码:

import pandas as pdfrom pyecharts.charts import Page, Sankeyfrom pyecharts import options as opts
data = pd.read_excel("C:/Users/yeahww/Desktop/GDP.xlsx",header = None,sheet_name = 'Sheet3')
# 生成nodesnodes = []for i in data[0].unique(): dic = {} dic['name'] = i nodes.append(dic)            # 生成linkslinks = []for i in data.values: dic = {} dic['source'] = i[0] dic['target'] = i[1] dic['value'] = i[2] links.append(dic) c = ( Sankey() .add("各地区GDP(亿元)", nodes, links, linestyle_opt=opts.LineStyleOpts(opacity = 0.4, curve = 0.5 , color="source" ,type_="dotted"), label_opts=opts.LabelOpts(position="right",), ) .set_global_opts(title_opts=opts.TitleOpts(title="全国各地区GDP桑基图")) )    c.render('Sankey_GDP.html')       

左右滑动查看更多

2、点击阅读原文查看Pyecharts官方绘制桑基图示例






►往期推荐

回复【Python】👉简单有用易上手

回复【学术前沿】👉机器学习丨大数据

回复【数据资源】👉公开数据

回复【可视化】👉你心心念念的数据呈现

回复【老姚专栏】👉老姚趣谈值得一看


►一周热文

数据呈现 | 八图献礼祖国70华诞,我爱我的祖国

特别推荐丨老姚专栏:教科书没有讲的矩估计性质

数据呈现 | R绘制树图,透视长三角一体化层次关系

学术前沿 | DMSP-OLS夜间城市灯光数据文献综述

工具&方法 | “名牌包”:面板、时间序列模型常用R语言包




数据Seminar

这里是大数据、分析技术与学术研究的三叉路口


作者:威武哥(叶武威)审阅:简华(何年华)编辑:青酱







    欢迎扫描👇二维码添加关注    


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存