桑基图是一种数据可视化技术或流程图,强调从一种状态到另一种状态或从一个时间到另一个时间的流动/移动/变化,其中箭头的宽度与所描绘的广泛属性的流速成正比。桑基图强调系统内的主要转移或流动。它们有助于确定流动中最重要的贡献。它们通常显示定义的系统边界内的守恒量。

2024对比2023局部桑基图

sankey-beta

%% source,target,value

2023,Python,14.82
Python,2024,21.9

2023,C++,10.67
C++,2024,11.6

2023,Java,8.92
Java,2024,10.51

2023,C,12.08
C,2024,8.38

2023,C#,7.71
C#,2024,5.62

sankey-beta

2023,JavaScript,2.9
JavaScript,2024,3.54

2023,Visual Basic,2.13
Visual Basic,2024,2.35

2023,Go,1.37
Go,2024,2.02

2023,Fortran,1.02
Fortran,2024,1.8
sankey-beta

%% source,target,value
2023,Delohi/Object Pascal,1.3
Delohi/Object Pascal,2024,1.68

2023,SQL,1.79
SQL,2024,1.64

2023,MATLAB,1.26
MATLAB,2024,1.48

2023,Rust,0.92
Rust,2024,1.45

2023,Scratch,1.36
Scratch,2024,1.41

2023,PHP,1.9
PHP,2024,1.21
sankey-beta

2023,Assembly language,1.64
Assembly language,2024,1.13

2023,R,0.97
R,2024,1.09

2023,Ruby,0.92
Ruby,2024,0.99

2023,COBOL,0.76
COBOL,2024,0.99

2023,Swift,1.07
Swift,2024,0.98

完整桑基图

sankey-beta

%% source,target,value

2023,Python,14.82
Python,2024,21.9

2023,C++,10.67
C++,2024,11.6

2023,Java,8.92
Java,2024,10.51

2023,C,12.08
C,2024,8.38

2023,C#,7.71
C#,2024,5.62

2023,JavaScript,2.9
JavaScript,2024,3.54

2023,Visual Basic,2.13
Visual Basic,2024,2.35

2023,Go,1.37
Go,2024,2.02

2023,Fortran,1.02
Fortran,2024,1.8

2023,Delohi/Object Pascal,1.3
Delohi/Object Pascal,2024,1.68

2023,SQL,1.79
SQL,2024,1.64

2023,MATLAB,1.26
MATLAB,2024,1.48

2023,Rust,0.92
Rust,2024,1.45

2023,Scratch,1.36
Scratch,2024,1.41

2023,PHP,1.9
PHP,2024,1.21

2023,Assembly language,1.64
Assembly language,2024,1.13

2023,R,0.97
R,2024,1.09

2023,Ruby,0.92
Ruby,2024,0.99

2023,COBOL,0.76
COBOL,2024,0.99

2023,Swift,1.07
Swift,2024,0.98

🖇️工程应用案例

Python C/C++ MATLAB

🍇Python桑基图

桑基图通过定义源来表示源节点、目标来表示目标节点、值来设置流量以及显示节点名称的标签来可视化对流的贡献。

 import plotly.graph_objects as go
 ​
 fig = go.Figure(data=[go.Sankey(
     node = dict(
       pad = 15,
       thickness = 20,
       line = dict(color = "black", width = 0.5),
       label = ["A1", "A2", "B1", "B2", "C1", "C2"],
       color = "blue"
     ),
     link = dict(
       source = [0, 1, 0, 2, 3, 3], # indices correspond to labels, eg A1, A2, A1, B1, ...
       target = [2, 3, 3, 4, 4, 5],
       value = [8, 4, 2, 8, 4, 2]
   ))])
 ​
 fig.update_layout(title_text="Basic Sankey Diagram", font_size=10)
 fig.show()

带有彩色链接的更复杂的桑基图

 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())
 ​
 # override gray link colors with 'source' colors
 opacity = 0.4
 # change 'magenta' to its 'rgba' value to add opacity
 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",
     # Define nodes
     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']
     ),
     # Add links
     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)
 fig.show()

Dash 是使用 Plotly 图表在 Python 中构建分析应用程序的最佳方式。

 from dash import Dash, dcc, html, Input, Output
 import plotly.graph_objects as go
 import json, urllib
 ​
 app = Dash(__name__)
 ​
 app.layout = html.Div([
     html.H4('Supply chain of the energy production'),
     dcc.Graph(id="graph"),
     html.P("Opacity"),
     dcc.Slider(id='slider', min=0, max=1,
                value=0.5, step=0.1)
 ])
 ​
 @app.callback(
     Output("graph", "figure"),
     Input("slider", "value"))
 def display_sankey(opacity):
     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()) # replace with your own data source
 ​
     node = data['data'][0]['node']
     node['color'] = [
         f'rgba(255,0,255,{opacity})'
         if c == "magenta" else c.replace('0.8', str(opacity))
         for c in node['color']]
 ​
     link = data['data'][0]['link']
     link['color'] = [
         node['color'][src] for src in link['source']]
 ​
     fig = go.Figure(go.Sankey(link=link, node=node))
     fig.update_layout(font_size=10)
     return fig
 ​
 app.run_server(debug=True)

此示例还使用悬停模式来启用多个工具提示。

 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())
 ​
 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']
   ))])
 ​
 fig.update_layout(
     hovermode = 'x',
     title="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=dict(size = 10, color = 'white'),
     plot_bgcolor='black',
     paper_bgcolor='black'
 )
 ​
 fig.show()