今天有读者问到怎么生成桑葚图,那就借这个问题来写一篇文章吧。
桑葚图更官方名称叫桑基图。(欢迎在公众号后台留言提问~)
桑基图通常用于可视化能源或成本转移,通过桑基图可以生动的展示数据的流动和来龙去脉,帮助我们确定各部分流量在总体中的大概占比情况。
桑基图通常类似下面图片展示的样式:(本文首发在“程序员coding”公众号)
在 python 中,可以借助 pyecharts 库生成桑基图。
使用 pip 命令安装:
pip install pyecharts
查看 pyecharts 版本:
import pyecharts
print(pyecharts.__version__)
桑基图主要由边、流量和支点(nodes)组成。
其中边代表了流动的数据,流量代表了流动数据的具体数值,节点代表了不同分类。
边的宽度与流量成比例地显示,边越宽,数值越大。
导入包
from pyecharts.charts import Sankey
from pyecharts import options as opts
节点(nodes)数据格式如下:
[
{"name": "category1"},
{"name": "category2"},
{"name": "category3"},
{"name": "category4"},
{"name": "category5"},
{"name": "category6"},
]
节点之间的关系(links)数据格式如下:
links = [
{"source": "category1", "target": "category2", "value": 10},
{"source": "category2", "target": "category3", "value": 15},
{"source": "category3", "target": "category4", "value": 20},
{"source": "category5", "target": "category6", "value": 25},
]
创建桑基图,设置了系列名称、组件离容器的距离、主标题跳转链接等配置,点击主标题可实现跳转链接效果。
title_link = "https://www.baidu.com"
sankey_base = (
Sankey(init_opts=opts.InitOpts(width='1300px', height='750px', bg_color='white', page_title="桑基图"))
.add(
series_name="sankey", # 系列名称,用于 tooltip 的显示,legend 的图例筛选。
nodes=nodes,
links=links,
pos_left="20%", # Sankey 组件离容器左侧的距离
pos_top="10%", # Sankey 组件离容器上侧的距离
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="桑基图-基本示例", pos_left="20%", title_link=title_link))
.render("sankey_base.html")
)
在浏览器中打开sankey_base.html
,效果如下:(本文首发在“程序员coding”公众号)
完整代码:
from pyecharts.charts import Sankey
from pyecharts import options as opts
#(本文首发在“程序员coding”公众号)
nodes = [
{"name": "category1"},
{"name": "category2"},
{"name": "category3"},
{"name": "category4"},
{"name": "category5"},
{"name": "category6"},
]
links = [
{"source": "category1", "target": "category2", "value": 10},
{"source": "category2", "target": "category3", "value": 15},
{"source": "category3", "target": "category4", "value": 20},
{"source": "category5", "target": "category6", "value": 25},
]
title_link = "http://mp.weixin.qq.com/s?__biz=MzI2NDA3MzQ0Mw==&mid=2648520238&idx=1&sn=350fda510d8aa834b551e50600f32f77&chksm=f29bafa2c5ec26b41f2e73e8a107f48ae208db57363bdb8fa231170c676dd21ee50b2d1c9f96#rd"
sankey_base = (
Sankey(init_opts=opts.InitOpts(width='1300px', height='750px', bg_color='white', page_title="桑基图"))
.add(
series_name="sankey", # 系列名称,用于 tooltip 的显示,legend 的图例筛选。
nodes=nodes,
links=links,
pos_left="20%", # Sankey 组件离容器左侧的距离
pos_top="10%", # Sankey 组件离容器上侧的距离
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="桑基图-基本示例", pos_left="20%", title_link=title_link))
.render("sankey_base.html")
)