【手把手陪你学Python】用pyecharts库画桑基图

桑基图是什么?

桑基图(Sankey diagram),即桑基能量分流图或桑基能量平衡图,是一种特定类型的流程图,主要由边、流量和节点组成,其中代表流动的数据,流量代表流动数据的具体数值,节点代表不同的分类,图中延伸的的宽度对应流量的大小

最初因1898年Matthew Henry Phineas Riall Sankey绘制的“蒸汽机的能源效率图”而闻名,故以其名字命名为“桑基图”

  • 要点1:核心在于展示数据的流转情况
  • 要点2:主要由边、流量和节点组成,边越宽流量越大
  • 要点3:遵循守恒定律,始末端的边宽度总和相等

第一步 准备Excel文件

本篇使用的数据集是对受访者关于“选择工作的最主要原因”的调查结果,受访者按学历分成“研究生及以上”、“大学本科”、“大学专科”、“高中/中专”、“初中及以下”,“选择工作的最主要原因”分别为“发展前景”、“工资待遇”、“工作地点”、“工作自由度”、“家庭原因”、“入职门槛低”、“兴趣爱好”、“其他”,按父类—子类—数据的格式整理成Excel文件

第二步 载入pyecharts库

import numpy as np
import pandas as pd
from pyecharts.charts import Sankey   #首次使用需先安装
from pyecharts import options as opts

第二步 读取Excel文件

data = pd.read_excel('C:/Users/dell-pc/Desktop/data.xlsx')
data.head(13)   #显示前13行数据

第三步 提取"父类"和"子类",转成集合set去重,再转成列表list

data['父类'].tolist()
data['子类'].tolist()
nodes = list(set(data['父类'].tolist() + data['子类'].tolist())) 
nodes

第四步 按指定格式生成节点数据

nodes_list = []
for i in nodes:
    dic = {}
    dic["name"] = i
    nodes_list.append(dic)
nodes_list

第五步 按指定格式生成边和流量数据

links_list = []
for i in range(len(data)):
    dic = {}
    dic['source'] = data.iloc[i,0]   #定义字典的"source"为数据集的第一列"父类"
    dic['target'] = data.iloc[i,1]   #定义字典的"target"为数据集的第二列"子类"
    dic['value'] = int(data.iloc[i,2])   #定义字典"value"为数据集第三列"数据"(使用int函数强制转换)
    links_list.append(dic)
links_list

第六步 绘制桑基图

pic = (
    Sankey()
    .add(
        "受访者人数",   #设置图例名称
        nodes_list,   #传入节点数据
        links_list,   #传入边和流量数据
        linestyle_opt = opts.LineStyleOpts(opacity = 0.5, curve = 0.5, color = "source"),   #设置透明度、弯曲度、颜色,color可以是"source"或"target"
        label_opts = opts.LabelOpts(position = "right"),   #设置标签位置,position可以是"top"、"left"、"right"、"bottom"等
        node_width = 20,    #设置节点矩形的宽度
        node_gap = 10,   #设置节点矩形的距离
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="选择工作的最主要原因"))   #设置图表标题
)
pic.render_notebook()

P.S. 节点布局的顺序和位置可手动调节

(选做)第七步 调整节点布局的方向

pic = (
    Sankey()
    .add(
        "受访者人数",   #设置图例名称
        nodes_list,   #传入节点数据
        links_list,   #传入边和流量数据
        linestyle_opt = opts.LineStyleOpts(opacity = 0.5, curve = 0.5, color = "source"),   #设置透明度、弯曲度、颜色,color可以是"source"或"target"
        label_opts = opts.LabelOpts(position = "bottom"),   #设置标签位置,position可以是"top"、"left"、"right"、"bottom"等
        node_width = 20,    #设置节点矩形的宽度
        node_gap = 20,   #设置节点矩形的距离
        orient="vertical",   #设置节点布局的方向,可以是"horizontal"或"vertical"
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="选择工作的最主要原因"))   #设置图表标题
)
pic.render_notebook()

★微信搜一搜“TriHub数据社”,欢迎关注获得入社福利

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值