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()