pyechart数据可视化丨制作桑基图(sankey)的最简单方法

前言
最近在分析超期库存数据, 每天4万条左右, 数据的特点是有很多分类变量, 为了展现这些变量的关系, 想到了桑吉图

Pyechart官网上有关于桑基图的案例, 但是如何用日常使用的excel数据整理成作图的数据, 却没有说明, 今天我们介绍下制作桑吉图的4个步骤。

本案例以泰坦尼克号乘客数据为例, 效果图如下:
在这里插入图片描述

在这里插入图片描述

1 读取数据

数据为excel表格, 前几列都为分类变量, 最后一列是需要计数或者求和的变量,在桑基图上显示为流量大小。

from pyecharts import options as opts
from pyecharts.charts import Sankey
import pandas as pd
import numpy as np
import json

data1 = pd.read_excel('./泰坦尼克数据.xlsx')
data1

在这里插入图片描述

2 整理成3列数据

数据转换成 父类→子类→值 这种格式;
从父类到子类, 每相邻的两个分类变量都需要计算. 使用pandas中数据透视表(pivot_table)方法, 计算后的数据纵向合并

# 名称列表
lis = data1.columns.tolist()[:-1]
# 两个子list
lis1 = lis[:-1]
lis2 = lis[1:]

data2 = pd.DataFrame()
for i in zip(lis1,lis2):    
    datai = data1.pivot_table('乘客ID',index=list(i),aggfunc='count').reset_index()
    datai.columns=[0,1,2]
    data2 = data2.append(datai)
    
data2    

在这里插入图片描述

3 生成作图数据

网上有很多资料说nodes和links需要是json格式, 在这里面实际上就是一个列表(list), 列表中每个元素都是一个字典;
重点注意: 需要将所有的节点都添加上. 而根据上面转换后的数据, 数据的第2列(列名称为1)有所有的节点名称除了顶级节点(原数据中第1列的分类), 此数据中顶级节点包括3个(C港口、Q港口、S港口)
数据转换思路: 构造一个空的列表(list); for循环; 构造一个空的字典(dict)并添加数据; 字典添加到列表中

3.1 生成nodes数据

# 生成nodes
nodes = []
# 先添加几个顶级的父节点
nodes.append({'name':'C港口'})
nodes.append({'name':'Q港口'})
nodes.append({'name':'S港口'})
# 添加其他节点
for i in data2[1].unique():    
    dic = {}    
    dic['name'] = i    
    nodes.append(dic)
nodes

在这里插入图片描述

3.2 生成linkds数据

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

在这里插入图片描述

4 作图

调用Sankey; 通过init_opts 设置图表大小和图表主题

c = (
    Sankey(init_opts=opts.InitOpts(width="1200px", height="800px",theme='westeros'))
    .add(
        "",
        nodes=nodes,  # 结点
        links=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="泰坦尼克号数据可视化"))
    .render("C:/Users/yyz/desktop/ABC.html")
)

5 注意点

  • 原数据中, 不同分类变量之间的名称(节点名)不能相同, 如果相同可在名称前用数字编号区别
  • 节点不能太多
  • 本例是将需要计数或者求和的变量放在了最后面, 分类变量在前

如果对你帮助, 欢迎点赞、关注!

相关阅读:

1. python小白, 1周入门python数据分析视频课程

2. pyechart可视化18式丨从柱形图的变化, 搞懂pyechart作图套路

3. 懂点excel作图, 怎么让pyechart作的图更具“职场范“呢?

4. 8个常用的python办公室自动化技巧,学会了同事都找你!

5. 学习python数据分析的30个练手数据+4个数据集网站

6. [工作必备]pandas数据分析处理52个常用技巧

7. pyechart制作第七次人口普查数据动态图

  • 12
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Python数据中的桑基图是一种用于展示流动关系的图表。通过使用matplotlib库中的Sankey类,可以创建一个桑基图对象,然后通过add()方法添加数据和配置选项,最后使用finish()方法完成桑基图的绘制。 在绘制桑基图时,可以设置流动的收入和支出数据,每个流动的标签,以及流动的方向。可以通过设置边缘线条颜色、填充颜色、透明度和图表中心的标签等来美桑基图。 示例代码如下: ```python import matplotlib.pyplot as plt from matplotlib.sankey import Sankey flows = [0.7, 0.3, -0.3, -0.1, -0.3, -0.1, -0.1, -0.1] labels = ["工资", "副业", "生活", "购物", "深造", "运动", "其他", "买书"] orientations = [1, 1, 0, -1, 1, -1, 1, 0] sankey = Sankey() sankey.add(flows=flows, labels=labels, orientations=orientations, color="black", fc="lightgreen", patchlabel="生活消费", alpha=0.7) diagrams = sankey.finish() diagrams<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python培训之可技术:桑基图怎么做?](https://blog.csdn.net/zy1992As/article/details/125275056)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Python数据 Pyecharts 制作 Sankey 桑基图](https://blog.csdn.net/qq_20288327/article/details/115696467)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python技巧(数据分析及可视化)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值