Минимизируйте пересечения в радиальном графе (networkx, graphviz) - PullRequest
1 голос
/ 27 апреля 2020

У меня сложный график, который я строю с использованием библиотеки python networkx, и я пытаюсь нарисовать его понятным способом. Мои данные структурированы таким образом, что у меня всегда есть центральный узел, затем набор узлов, которые находятся на расстоянии 1 от центра, и затем другой набор узлов, которые находятся на расстоянии 2 от центра. Под «расстоянием» я подразумеваю минимальное количество ребер до достижения центрального узла. Из-за этой структуры я хотел бы нарисовать график радиальным образом, где узлы расстояния 1 лежат на окружности с фиксированным радиусом от центра, скажем, r=1, а узлы расстояния 2 на окружности r=2. Примерно так: enter image description here Я пробовал разные подходы, но до сих пор наиболее перспективным было использование networkx.drawing.layout.shell_layout, которое выдает следующую компоновку: enter image description here Все узлы находятся на правильном расстоянии от центрального, но проблема в том, что положение узлов на окружностях не выбрано для минимизации пересечений краев. Это четко указано на связанной странице «Этот алгоритм в настоящее время работает только в двух измерениях и не пытается минимизировать пересечения ребер». Я посмотрел как в документации библиотеки networkx , так и в pygraphviz one , но я не нашел макетов, позволяющих минимизировать пересечения и расположить узлы на концентрических c окружностях в в то же время. Кто-нибудь знает, как это сделать?

Редактировать: Вот ребра графа, показанного на рисунке 2 (это ориентированный граф!).

edges = [((3, 446), (3, 439)), ((3, 446), (3, 502)), ((3, 446), (3, 2366)), ((3, 446), (3, 382)), ((3, 446), (3, 3556)), ((3, 446), (4, 1778)), ((3, 446), (3, 1214)), ((3, 446), (3, 445)), ((3, 446), (4, 758)), ((3, 439), (2, 253)), ((3, 439), (3, 446)), ((3, 439), (3, 3482)), ((3, 439), (4, 1763)), ((3, 439), (3, 2359)), ((3, 439), (3, 319)), ((2, 253), (3, 439)), ((2, 127), (3, 502)), ((3, 502), (2, 127)), ((3, 502), (3, 446)), ((3, 502), (3, 4004)), ((3, 502), (3, 508)), ((3, 502), (4, 998)), ((3, 502), (3, 3986)), ((3, 502), (4, 2018)), ((3, 502), (3, 1270)), ((3, 4004), (3, 502)), ((3, 4004), (3, 3556)), ((4, 1270), (4, 758)), ((4, 758), (3, 446)), ((4, 758), (4, 998)), ((4, 758), (4, 502)), ((4, 758), (4, 638)), ((4, 758), (4, 743)), ((4, 758), (4, 1270)), ((3, 508), (3, 502)), ((4, 2300), (3, 382)), ((3, 382), (4, 2300)), ((3, 382), (3, 254)), ((3, 382), (3, 446)), ((3, 1270), (3, 1214)), ((3, 1270), (3, 502)), ((3, 1214), (3, 1270)), ((3, 1214), (3, 446)), ((3, 1214), (3, 1207)), ((3, 1214), (3, 254)), ((3, 3482), (3, 439)), ((3, 3482), (3, 3538)), ((2, 254), (3, 3556)), ((3, 3556), (3, 4004)), ((3, 3556), (2, 254)), ((3, 3556), (4, 1660)), ((3, 3556), (3, 446)), ((4, 1763), (3, 439)), ((4, 1763), (4, 1778)), ((2, 191), (3, 2366)), ((3, 2366), (4, 3190)), ((3, 2366), (3, 2359)), ((3, 2366), (3, 446)), ((3, 2366), (2, 191)), ((4, 3190), (3, 2366)), ((4, 998), (4, 758)), ((4, 998), (3, 502)), ((3, 3986), (3, 502)), ((3, 3986), (3, 3538)), ((3, 2359), (3, 2366)), ((3, 2359), (3, 439)), ((4, 1660), (3, 3556)), ((4, 3698), (4, 1778)), ((4, 1778), (4, 2018)), ((4, 1778), (4, 1780)), ((4, 1778), (4, 1763)), ((4, 1778), (3, 446)), ((4, 1778), (4, 3698)), ((4, 2018), (4, 1778)), ((3, 254), (3, 382)), ((3, 254), (3, 1214)), ((4, 1780), (4, 1778)), ((4, 502), (3, 382)), ((4, 502), (4, 758)), ((4, 638), (4, 758)), ((3, 319), (3, 439)), ((4, 743), (4, 758)), ((4, 743), (3, 439)), ((3, 1207), (3, 439)), ((4, 3320), (3, 445)), ((3, 445), (3, 446)), ((3, 445), (4, 3320)), ((3, 445), (3, 443)), ((3, 443), (3, 3538)), ((3, 3538), (3, 3986)), ((3, 3538), (3, 3482)), ((3, 3538), (3, 446)), ((3, 3538), (3, 443)), ((4, 1777), (4, 1778))]

1 Ответ

0 голосов
/ 28 апреля 2020

Я сделал это! Используя twopi макет pygraphviz (как первоначально предложено @ srou sh в комментарии к этому похожему вопросу ) и указав узел, который я хочу быть в центре, как 'root 'узел (это та часть, которую я пропустил!). Вывод следующий: enter image description here Да, это все еще немного грязно, но я должен быть в состоянии улучшить его, настроив длину краев, и в любом случае, я думаю, это лучшее, что я могу сделать с моими грязными данными!

...