python可视化-桑基图(事件流分析)

1、数据生成

# Faker库是Python中一个强大的Mock数据生成库,可以帮助开发者快速生成各种Mock数据,从而简化开发和测试过程。在开发项目中,我们经常需要生成一些虚拟数据,如虚拟用户、订单、地址等。为了简化这个过程,Python提供了Faker库,一个强大的Mock数据生成器。
import pandas as pd
import numpy as np
import calendar
import random
from faker import Faker
from faker.providers import BaseProvider, internet

# 自定义枚举
fake = Faker()
class MyProvider(BaseProvider):
    def myCityLevel(self):
        cl = ["一线", "二线", "三线", "四线+城市"]
        return cl[random.randint(0, len(cl)-1)]
    def myPost(self):
        pt = ['数据分析师', '算法工程师', '产品经理', '数据开发', '前端开发', '用户运营', '设计师', '其他']
        return pt[random.randint(0, len(pt)-1)]
    def myGender(self):
        g = ['F', 'M']
        return g[random.randint(0, len(g)-1)]
    
fake.add_provider(MyProvider)

# 构造假数据
uid=[]
month=[]
cityLevel=[]
gender=[]
post=[]
income=[]
cost=[]
for i in range(1000):
    uid.append(i)
    month.append(calendar.month_abbr[int(fake.month())])
    cityLevel.append(fake.myCityLevel())
    gender.append(fake.myGender())
    post.append(fake.myPost())
    income.append(fake.random_int(min=3000, max=100000))
    cost.append(fake.random_int(min=600, max=80000))

raw_data= pd.DataFrame({'uid':uid,
                        'month':month,
                        'cityLevel':cityLevel,
                        'gender':gender,
                        'post':post,
                        'income':income,
                        'cost':cost,
                       })

raw_data.head()

2、数据处理

# 构造数据格式分类1-分类2-value
lis = raw_data[['month', 'cityLevel', 'gender', 'post']].columns.tolist()  # ['month', 'cityLevel', 'gender', 'post']
lis1 = lis[:-1] # ['month', 'cityLevel', 'gender']
lis2 = lis[1:]  # ['cityLevel', 'gender', 'post']

df = pd.DataFrame()
for i in zip(lis1, lis2):   
    data_ = raw_data.pivot_table(index=list(i),values=['uid', 'income', 'cost'],
                     aggfunc={'uid':'count', 'income':np.sum, 'cost':np.sum}).reset_index()
    data_.columns=[0, 1, 2, 3, 4]
    df = pd.concat([df, data_], axis=0, ignore_index=True)
df

 3、事件流分析-桑基图

from pyecharts import options as opts
from pyecharts.charts import Sankey

def plot_sankey(df, orient=None):
    '''
    df:数据集,仅含分类1-分类2-value三列
    orient:方向(默认为'horizontal')vertical为垂直方向
    '''
    if orient=='vertical':
        position='top'
    else:
        position='right'
    # 生成nodes
    nodes = []
    # 添加所有
    for i in set(list(df[0].unique())+list(df[1].unique())):
        dic = {}
        dic['name'] = i
        nodes.append(dic)
    
    # 定义节点和流量
    links = []
    for i in df.values:
        dic = {}
        dic['source'] = i[0]
        dic['target'] = i[1]
        dic['value'] = i[2]
        links.append(dic)
    
    # 绘图
    sk = (
        Sankey(init_opts=opts.InitOpts(width="1200px", height="800px",theme='westeros'))
        .add(
            "",
            nodes=nodes,
            links=links,
            orient=orient,
            layout_iterations=0,
            linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),
            label_opts=opts.LabelOpts(position=position),
        ).set_global_opts(title_opts=opts.TitleOpts(title="岗位人数桑基图", pos_left = '40%'))
    )
    return sk.render_notebook()

df_sk = df[[0,1,4]] # 仅针对岗位人数绘制桑基图
plot_sankey(df_sk)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值