Sankey.md
Data:
object key: source node
object value’s key: target: node
object value’s value: amount
import plotly.graph_objects as go
data = {
"0-0": {
"1-1": 12142,
"1-2": 248324,
"1-3": 1546,
"1-4": 58940,
"1-5": 102753
},
"1-1": {
"2-1": 1948,
"2-2": 2469,
"2-3": 45,
"2-4": 433,
"2-5": 1463
},
"1-2": {
"2-1": 2853,
"2-2": 124350,
"2-3": 238,
"2-4": 4709,
"2-5": 10077
},
"1-3": {
"2-1": 78,
"2-2": 239,
"2-3": 182,
"2-4": 219,
"2-5": 218
},
"1-4": {
"2-1": 234,
"2-2": 3457,
"2-3": 18,
"2-4": 9788,
"2-5": 1785
},
"1-5": {
"2-1": 800,
"2-2": 4550,
"2-3": 489,
"2-4": 26172,
"2-5": 32258
},
"2-1": {
"3-1": 1071,
"3-2": 1427,
"3-3": 19,
"3-4": 230,
"3-5": 753
},
"2-2": {
"3-1": 1579,
"3-2": 82388,
"3-3": 144,
"3-4": 2623,
"3-5": 5756
},
"2-3": {
"3-1": 50,
"3-2": 177,
"3-3": 142,
"3-4": 123,
"3-5": 159
},
"2-4": {
"3-1": 160,
"3-2": 2630,
"3-3": 13,
"3-4": 7115,
"3-5": 1475
},
"2-5": {
"3-1": 560,
"3-2": 3278,
"3-3": 309,
"3-4": 11847,
"3-5": 16853
},
"3-1": {
"4-1": 650,
"4-2": 935,
"4-3": 9,
"4-4": 134,
"4-5": 423
},
"3-2": {
"4-1": 1257,
"4-2": 58135,
"4-3": 113,
"4-4": 2055,
"4-5": 4741
},
"3-3": {
"4-1": 30,
"4-2": 131,
"4-3": 102,
"4-4": 76,
"4-5": 96
},
"3-4": {
"4-1": 113,
"4-2": 1725,
"4-3": 8,
"4-4": 4296,
"4-5": 821
},
"3-5": {
"4-1": 357,
"4-2": 2207,
"4-3": 187,
"4-4": 6277,
"4-5": 9601
},
"4-1": {
"5-1": 445,
"5-2": 702,
"5-3": 6,
"5-4": 96,
"5-5": 304
},
"4-2": {
"5-1": 841,
"5-2": 43437,
"5-3": 75,
"5-4": 1287,
"5-5": 3098
},
"4-3": {
"5-1": 21,
"5-2": 93,
"5-3": 70,
"5-4": 48,
"5-5": 54
},
"4-4": {
"5-1": 75,
"5-2": 1264,
"5-3": 6,
"5-4": 2699,
"5-5": 494
},
"4-5": {
"5-1": 254,
"5-2": 1685,
"5-3": 112,
"5-4": 3853,
"5-5": 6040
},
"5-1": {
"6-1": 316,
"6-2": 488,
"6-3": 5,
"6-4": 66,
"6-5": 214
},
"5-2": {
"6-1": 625,
"6-2": 33459,
"6-3": 50,
"6-4": 901,
"6-5": 2346
},
"5-3": {
"6-1": 15,
"6-2": 72,
"6-3": 49,
"6-4": 30,
"6-5": 27
},
"5-4": {
"6-1": 45,
"6-2": 907,
"6-3": 5,
"6-4": 1737,
"6-5": 289
},
"5-5": {
"6-1": 170,
"6-2": 1249,
"6-3": 74,
"6-4": 2317,
"6-5": 3929
},
"6-1": {
"7-1": 231,
"7-2": 362,
"7-3": 3,
"7-4": 48,
"7-5": 156
},
"6-2": {
"7-1": 473,
"7-2": 26188,
"7-3": 34,
"7-4": 712,
"7-5": 1780
},
"6-3": {
"7-1": 10,
"7-2": 53,
"7-3": 38,
"7-4": 20,
"7-5": 18
},
"6-4": {
"7-1": 37,
"7-2": 631,
"7-3": 4,
"7-4": 1149,
"7-5": 184
},
"6-5": {
"7-1": 126,
"7-2": 983,
"7-3": 57,
"7-4": 1523,
"7-5": 2665
}
}
source = [0,0,0,0,0]
# source append 1,1,1,1,1 and 2,2,2,2,2 and so on until 30,30,30,30,30
for i in range(1,31):
for j in range(1,6):
source.append(i)
target = [1,2,3,4,5]
# target append 6,7,8,9,10, repeat 5 times, append become 11,12,13,14,15, repeats 5 times, until 31,32,33,34,35
for i in range(1,31):
for j in range(1,6):
target.append(i+5)
def extract_values(obj):
values = []
for value in obj.values():
if isinstance(value, dict):
values.extend(extract_values(value))
else:
values.append(value)
return values
resultValues = extract_values(data)
fig = go.Figure(data=[go.Sankey(
node=dict(
pad=15,
thickness=20,
line=dict(color="black", width=0.5),
label=[
"0-0", #0
"1-1", #1
"1-2", #2
"1-3", #3
"1-4", #4
"1-5", #5
"2-1", #6
"2-2", #7
"2-3", #8
"2-4", #9
"2-5", #10
"3-1", #11
"3-2", #12
"3-3", #13
"3-4", #14
"3-5", #15
"4-1", #16
"4-2", #17
"4-3", #18
"4-4", #19
"4-5", #20
"5-1", #21
"5-2", #22
"5-3", #23
"5-4", #24
"5-5", #25
"6-1", #26
"6-2", #27
"6-3", #28
"6-4", #29
"6-5", #30
"7-1", #31
"7-2", #32
"7-3", #33
"7-4", #34
"7-5" #35
],
color="blue"
),
link=dict(
source=source,
target=target,
value=resultValues
))])
fig.update_layout(title_text="Basic Sankey Diagram", font_size=10)
fig.show()