Диаграмма Sankey в plotly: нужно расположить узлы в виде столбцов. Возможно ли это, не изменяя x и y?

Может ли кто-нибудь со знанием Sankey-charts помочь?

Я создаю санкей-схему, которая имеет узлы 4 различных категорий. Мне нужно, чтобы 1-я группа узлов отображалась слева один под другим, затем 2-я группа должна быть справа и т.д.

Это действительно работает как шарм из коробки, но ТОЛЬКО если мои узлы взаимосвязаны таким образом, что можно провести линию для отслеживания связей от узла категории1 --> к узлу категории2 --> к узлу категории3 --> к узлу категории 4.

К сожалению, в моих данных это не всегда так. Некоторые связи "короче" и включают только 2 или 3 узла.

В результате, если между узлом из 3-го столбца и узлом из 4-го столбца нет связи, то этот узел смещается вправо и становится выровненным по 4-му столбцу.

Я пробовал разные способы и обнаружил, что могу решить эту задачу, предоставляя координаты x и y для каждого узла. Это хорошо, но я чувствую, что моя реализация этого будет беспорядочной, потому что базовые данные каждый раз разные, следовательно, мне нужно проделать много работы, чтобы придумать y-координаты. (Например, если у меня есть 20 узлов, которые я хочу отобразить в одном столбце: мне нужно взять диапазон, скажем, от 0.05 до 0.95 и разделить его на 19). Мне нужно сделать это отдельно для каждого "столбца".

Я попробовал предоставить координаты x без соответствующих координат y в надежде, что алгоритм сам разберется с остальным, но он просто проигнорировал мои параметры x.

Также я наткнулся на параметр domain_column, но не смог понять, как его использовать, так как документация была скудной.

Пожалуйста, оставьте любые предложения, которые у вас могут быть. Заранее большое спасибо!

p.s. Вот мой код, использующий x's и y's. Надеюсь найти более простой и элегантный способ:

import plotly.graph_objects as go
fig = go.Figure(go.Sankey(
    node = {
        "label": ["1a","1b", "2a", "2b", "3a", "3b", "4b"],
        "x": [0.05, 0.05, 0.35, 0.35, 0.65, 0.65, 0.95],
        "y": [0.25, 0.75, 0.25, 0.75, 0.70, 0.25, 0.7],
        "pad":500,
        "thickness":70,
        "color":"red"
        },
    link = {
        "source": [0, 1, 2, 3, 5, 3],
        "target": [3, 2, 4, 5, 6, 4],
        "value": [1, 1, 1, 1, 1, 1, 1]}))
#fig.update_traces(domain_column=8, selector=dict(type='sankey')) 
fig.show() 
Вернуться на верх