Диаграмма 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()