流程图(三)利用python绘制桑基图

流程图(三)利用python绘制桑基图

桑基图(Sankey diagram)简介

桑基图经常用于能源、金融行业,对材料、成本的流动进行可视化分析。现在很多互联网行业还使用桑基图做用户流动性分析,能很好地观察数据成分的变动大小及变动方向。

快速绘制

  1. 基于plotly

    python 复制代码
    import plotly.graph_objects as go
    import urllib, json
    
    # 导入数据
    url = 'https://raw.githubusercontent.com/plotly/plotly.js/master/test/image/mocks/sankey_energy.json'
    response = urllib.request.urlopen(url)
    data = json.loads(response.read())
    
    # 将所有的"magenta"颜色更改为rgba(255,0,255, 0.8),并将所有连接颜色更改为其对应的'source'节点颜色且透明度是0.4
    opacity = 0.4
    data['data'][0]['node']['color'] = ['rgba(255,0,255, 0.8)' if color == "magenta" else color for color in data['data'][0]['node']['color']]
    data['data'][0]['link']['color'] = [data['data'][0]['node']['color'][src].replace("0.8", str(opacity))
                                        for src in data['data'][0]['link']['source']]
    
    fig = go.Figure(data=[go.Sankey(
        valueformat = ".0f",
        valuesuffix = "TWh",
        # 定义节点
        node = dict(
          pad = 15,
          thickness = 15,
          line = dict(color = "black", width = 0.5),
          label =  data['data'][0]['node']['label'],
          color =  data['data'][0]['node']['color']
        ),
        # 添加连接
        link = dict(
          source =  data['data'][0]['link']['source'],
          target =  data['data'][0]['link']['target'],
          value =  data['data'][0]['link']['value'],
          label =  data['data'][0]['link']['label'],
          color =  data['data'][0]['link']['color']
    ))])
    
    fig.update_layout(title_text="Energy forecast for 2050<br>Source: Department of Energy & Climate Change, Tom Counsell via <a href='https://bost.ocks.org/mike/sankey/'>Mike Bostock</a>",
                      font_size=10)
  2. 基于pyecharts

    python 复制代码
    import pyecharts.options as opts
    from pyecharts.charts import Sankey
    import urllib, json
    
    # 导入数据
    url = 'https://echarts.apache.org/examples/data/asset/data/energy.json'
    response = urllib.request.urlopen(url)
    data = json.loads(response.read())
    
    c = (
        Sankey()
        .add(
            series_name="",
            nodes=data["nodes"],
            links=data["links"],
            itemstyle_opts=opts.ItemStyleOpts(border_width=1, border_color="#aaa"),
            linestyle_opt=opts.LineStyleOpts(color="source", curve=0.5, opacity=0.5),
            tooltip_opts=opts.TooltipOpts(trigger_on="mousemove"),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title=""))
    )
    
    c.render_notebook()
  3. 基于pysankey

    python 复制代码
    import pandas as pd
    from pySankey.sankey import sankey
    
    # 基于source和target,数据可重复出现,出现次数越多,权重越大(即线越粗)
    url = "https://raw.githubusercontent.com/anazalea/pySankey/master/pysankey/fruits.txt"
    df = pd.read_csv(url, sep=" ", names=["true", "predicted"])
    
    colors = {
        "apple": "#f71b1b",
        "blueberry": "#1b7ef7",
        "banana": "#f3f71b",
        "lime": "#12e23f",
        "orange": "#f78c1b"
    }
    
    sankey(df["true"], df["predicted"], aspect=20, colorDict=colors, fontsize=12)
    python 复制代码
    import pandas as pd
    from pySankey.sankey import sankey
    
    # 基于source和、target和value,数据可仅出现一次,value即权重
    url = "https://raw.githubusercontent.com/anazalea/pySankey/master/pysankey/customers-goods.csv"
    df = pd.read_csv(url, sep=",")
    
    sankey(
        left=df["customer"], right=df["good"], 
        leftWeight= df["revenue"], rightWeight=df["revenue"], 
        aspect=20, fontsize=20
    )

    总结

    以上通过plotly、pyecharts和pysankey快速绘桑基图。

    共勉~

相关推荐
格子先生Lab1 分钟前
Java反射机制深度解析与应用案例
java·开发语言·python·反射
Samuel-Gyx1 小时前
2025第十六届蓝桥杯python B组满分题解(详细)
python·职场和发展·蓝桥杯
行者无疆xcc1 小时前
【Django】设置让局域网内的人访问
后端·python·django
患得患失9492 小时前
【后端】【python】Python 爬虫常用的框架解析
开发语言·爬虫·python
图表制作解说(目标1000个图表)2 小时前
ECharts散点图-散点图13,附视频讲解与代码下载
echarts·统计分析·数据可视化·散点图·大屏可视化
愚公搬代码3 小时前
【愚公系列】《Python网络爬虫从入门到精通》058-自定义分布式爬取诗词排行榜数据
分布式·爬虫·python
不会飞的鲨鱼3 小时前
【某比特币网址请求头部sign签名】RSA加密逆向分析
javascript·爬虫·python
令狐少侠20113 小时前
AI之pdf解析:Tesseract、PaddleOCR、RapidPaddle(可能为 RapidOCR)和 plumberpdf 的对比分析及使用建议
人工智能·python·pdf
世界的尽头在哪里4 小时前
python测试框架之pytest
开发语言·python·测试工具·单元测试·pytest
_一条咸鱼_4 小时前
Python 语法之注释详解(二)
人工智能·python·面试