JUNG - лучшие макеты для отображения больших графов (~1000 узлов)

Я хочу перейти с YFiles на Jung. Когда дело доходит до небольших графиков, отображение почти похоже на YFiles. Но для больших графиков я не нашел макета, который соответствовал бы моим ожиданиям. Вот график с 1000 элементами, который YFiles показывает очень хорошо: Отображение графика YFiles

У Юнга существуют непостоянные расстояния между подграфами, как на этом рисунке:

Отображение графика JUNG

Для JUNG я использовал SparseMultigraph с FRLayout со следующими атрибутами:

FRLayout<GraphNode, GraphLink> layout = new FRLayout<>(graph);
layout.setMaxIterations(100);
layout.setAttractionMultiplier(0.2); // default 0.75
layout.setRepulsionMultiplier(0.3); // default 0.75

Я много играл с количеством итераций, множителем притяжения и множителем отталкивания, но это лучшая комбинация, которую я нашел.

Есть ли более подходящий макет / график для отображения такого графика, чтобы получить что-то похожее на то, что отображает YFiles?


person Dragos Velcea    schedule 11.11.2016    source источник


Ответы (1)


У вас есть очень конкретный результат, который вы хотите от своего макета, поэтому, вероятно, вам лучше всего будет реализовать свой собственный алгоритм макета. Макеты, которые предоставляет JUNG, должны быть довольно общими и достаточно хорошо работать для самых разных графиков; от них не ожидается, что они будут делать именно то, что вам нужно для любого конкретного графа.

Один из вариантов, который у вас будет, если вы сможете узнать, какой алгоритм использует YFiles, — это просто повторно реализовать их алгоритм.

Однако в этом случае, поскольку ваш граф выглядит как совокупность ряда независимых изолированных компонентов точно такого же размера и топологии, я бы предложил создать специализированную реализацию, детерминистически разбивающую граф. Вы можете использовать WeakComponentClusterer для идентификации компонентов, использовать простую формулу, чтобы выяснить, где должны быть относительные позиции для каждого элемента компонента, а затем разместить каждый компонент.

StaticLayout было бы полезно для детерминированного подхода.

person Joshua O'Madadhain    schedule 11.11.2016
comment
Я не совсем уверен, но вполне может быть, что мы размещаем компоненты отдельно, чтобы избежать именно такой проблемы. Я предполагаю, что JUNG может потребовать, чтобы этот шаг был явным. - person Joey; 25.11.2016