首页 > 编程笔记 > Python笔记 阅读:60

Python绘制桑基图(附带实例)

桑基图(Sankey Diagram)是一种用于可视化流量、流程或能量转移的图表类型。它使用有向图的方式表示数据的流动,通过不同宽度的箭头连接表示不同的流量量级,并显示出流量的起点和终点。

桑基图的优点是能够直观地显示数据的流动和转移过程,帮助观察数据的来源、目的和量级。它可用于可视化各种流程,如物质流量、能源转移、人员流动等。

【实例】绘制简易桑基图,展示节点之间的流动关系和数量关系。输入如下代码:
import plotly.graph_objects as go

# 创建桑基图
fig = go.Figure(go.Sankey(
    arrangement="snap",
    node={
        "label": ["A", "B", "C", "D", "E", "F"],
        "x": [0.2, 0.1, 0.5, 0.7, 0.3, 0.5],
        "y": [0.7, 0.5, 0.2, 0.4, 0.2, 0.3],
        'pad': 10
    },
    link={
        "source": [0, 0, 1, 2, 5, 4, 3, 5],
        "target": [5, 3, 4, 3, 0, 2, 2, 3],
        "value": [1, 2, 1, 1, 1, 1, 1, 2]
    }
))

fig.show()
上述代码绘制的桑基图显示了 6 个节点(A、B、C、D、E、F),它们之间存在流动关系,每条链接表示一定数量的流动。

 
输出的结果如下图所示:


图 1 简易桑基图

【实例 2】通过绘制桑基图展示 2050 年能源预测数据。输入如下代码:
import plotly.graph_objects as go
import json

# 从本地文件获取数据
file_path='D:/sankey_energy.json'
with open(file_path, 'r') as file: data=json.load(file)

# 重写灰色链接的颜色为对应源节点的颜色,并添加透明度
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']]

# 创建 Sankey 图
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", font_size=10)
fig.show()
上述代码显示了不同能源之间的流动关系,以及它们的数量关系。代码中使用 go.Sankey 创建桑基图,并设置节点和链接的属性。使用 update_layout() 方法设置图表的标题和字体大小。使用 show() 方法显示生成的桑基图。

输出的结果如下图所示:


图 2 桑基图

相关文章