来源:Python数据之道
作者:Peter
整理:Lemon
桑基图绘制实践
本文中介绍的是如何制作桑基图,使用的可视化库是强大的 Pyecharts
(版本1.7.1,版本一致很重要)。文章将从如下几个方面进行介绍:
什么是桑基图
官网的两个
demo
桑基图绘制项目实战
在开始之前,我们先来看看通过本文制作的最终效果图:
什么是桑基图?
桑基图(桑葚图),也叫桑基能量分流图或者桑基能量平衡图,里面的桑基其实是一个人名,全名是 马修·亨利·菲尼亚斯·里尔·桑基(Matthew Henry Phineas Riall Sankey)
,是一名爱尔兰裔工程师,也是英国皇家陆军工兵的上尉[1]。
早在 1898 年的时候,他就使用这种图形来表示蒸汽机的能源效率:
桑基之后,桑基图逐渐成为科学和工程领域,代表平衡、能量流、物质流的标准模型,在一些产品的生命周期评估中也常被使用,通常应用于能源、材料成分、金融等数据的可视化分析。主要特点是:
图形由边、流量和支点组成。边代表了流动的数据,流量代表了流动数据的具体数值,节点代表了不同分类
始末端的分支宽度总和相等,即所有主支宽度的总和应与所有分出去的分支宽度的总和相等,保持能量的平衡。
官网demo
本文中使用的Pyecharts
版本是1.7.1
,版本的一致非常重要。
import pyecharts
pyecharts.__version__
demo_1
首先我们看看官网的第一个demo
:
from pyecharts import options as opts
from pyecharts.charts import Sankey
nodes = [ # 所有节点名称
{"name": "category1"},
{"name": "category2"},
{"name": "category3"},
{"name": "category4"},
{"name": "category5"},
{"name": "category6"},
]
links = [ # 每一条链路的数据,包含:父节点source + 子节点target + 数据值value
{"source": "category1", "target": "category2", "value": 10},
{"source": "category2", "target": "category3", "value": 15},
{"source": "category3", "target": "category4", "value": 20},
{"source": "category5", "target": "category6", "value": 25},
]
c = (
Sankey()
.add(
"sankey",
nodes,
links,
linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),
label_opts=opts.LabelOpts(position="right"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="Sankey-基本示例"))
# .render("sankey_base.html") 生成HTML文件
)
c.render_notebook() # jupyter notebook中在线显示
在上面的代码中,nodes
部分表示的是所有的节点名称,不管是父节点还是最小的子节点都要列出来;links
部分表示的是每条链路的数据,包含:父节点source + 子节点target + 数据值value。根据links的数据,我们可以发现:category1——-category2———category3———category4
构成了一条完整的链路,category5—category6
构成了另一条链路。
下面是最终的图形:
demo_2
接下来我们看看官网的第二个demo
:
import json
from pyecharts import options as opts
from pyecharts.charts import Sankey
with open("product.json", "r", encoding="utf-8") as f: # 导入json数据
j = json.load(f) # json数据转成字典数据
c = (
Sankey()
.add(
"sankey",
nodes=j["nodes"], # 取出json数据的节点和链路数据
links=j["links"],
pos_top="10%",
focus_node_adjacency=True,
levels