桑基图是一种数据可视化技术或流程图,强调从一种状态到另一种状态或从一个时间到另一个时间的流动/移动/变化,其中箭头的宽度与所描绘的广泛属性的流速成正比。桑基图强调系统内的主要转移或流动。它们有助于确定流动中最重要的贡献。它们通常显示定义的系统边界内的守恒量。
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
桑基图通过定义源来表示源节点、目标来表示目标节点、值来设置流量以及显示节点名称的标签来可视化对流的贡献。
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()