Python绘制桑基图(附带实例)
桑基图(Sankey Diagram)是一种用于可视化流量、流程或能量转移的图表类型。它使用有向图的方式表示数据的流动,通过不同宽度的箭头连接表示不同的流量量级,并显示出流量的起点和终点。
桑基图的优点是能够直观地显示数据的流动和转移过程,帮助观察数据的来源、目的和量级。它可用于可视化各种流程,如物质流量、能源转移、人员流动等。
【实例】绘制简易桑基图,展示节点之间的流动关系和数量关系。输入如下代码:
输出的结果如下图所示:

图 1 简易桑基图
【实例 2】通过绘制桑基图展示 2050 年能源预测数据。输入如下代码:
输出的结果如下图所示:

图 2 桑基图
桑基图的优点是能够直观地显示数据的流动和转移过程,帮助观察数据的来源、目的和量级。它可用于可视化各种流程,如物质流量、能源转移、人员流动等。
【实例】绘制简易桑基图,展示节点之间的流动关系和数量关系。输入如下代码:
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 桑基图