Какая библиотека визуализации графов подходит для статического узла и ребер с текстом?

#graphviz #graph-visualization

#graphviz #график-визуализация

Вопрос:

Я хотел бы реализовать график на Java. Я определил класс Node и класс Edge , и граф представлен списком узлов, и для каждого узла список ребер, начинающихся с узла, определяется как поле узла. Теперь я хотел бы использовать некоторую библиотеку Java для визуализации графика.

В настоящее время я пробовал graphviz-java. Результат соответствует моим требованиям, но ребра и узлы расположены неправильно. Смотрите следующий график ниже:

graphviz-результат java

Я создал график с помощью API, который он предоставил, например node(xxx) , addLink() путем обхода списка узлов моего графика вместо генерации необработанного текста точечного файла.

Ключевой код создания графика выглядит следующим образом:

 for (LiteralNode litNode : literalNodeArrayList) 
{
    
    MutableNode mutableNode = mutNode(litNode.getNodeElement());
    
    for (Edge e : litNode.getEdgeList()) {
        
    MutableNode endNode = mutNode(e.endNode.getNodeElement());
    mutableNode.addLink(to(endNode.port(Compass.NORTH)).add(Arrow.VEE));

}
    
    mutableNodes.add(mutableNode);
    
    g.add(mutableNode);

}
  

Это в основном простой обход с циклами. Узел и ребра динамически изменяются в соответствии с различными случаями.

Я бы хотел, чтобы узел и ребра скорректировали местоположение, чтобы улучшить отображение графика. Я также пытался использовать json-файл и d3js для визуализации графика, но обнаружил, что эти библиотеки слишком сосредоточены на отображении огромного количества узлов и их распределений, которые мне не нужны. Мне нравится структура graphviz, предоставленная с некоторой стратификацией. Итак, я хотел бы получить некоторые рекомендации.

Я упомянул файл json, потому что, если библиотека Java недоступна, я мог бы также попробовать какую-нибудь библиотеку javascript, например d3js, и использовать java только как серверный инструмент для генерации файла json, который мне нужно ввести. Таким образом, рекомендация не ограничивается Java.

Ответ №1:

Все атрибуты graphviz (https://graphviz.gitlab.io/_pages/doc/info/attrs.html ) поддерживаются.

  • Расстояния между узлами задаются с помощью «ranksep» и «nodesep».
  • Чтобы принудительно расположить узлы на одном уровне, добавьте подграф с «rank = same» и узлы, которые должны быть выровнены.

Вот простой пример:

 Graph g = graph()
                .graphAttr().with(attr("ranksep", .1), attr("nodesep", .1))
                .with(graph().graphAttr().with(Rank.SAME).with(node("a"), node("c")))
                .with(node("a").link("b"), node("b").link("c"));
  

Комментарии:

1. На этих примерах я теперь понимаю, как использовать атрибуты. Спасибо за ответ и работу!

Ответ №2:

Для меня график выглядит хорошо. Что вы подразумеваете под «Я бы хотел, чтобы узел и ребра скорректировали местоположение, чтобы улучшить отображение графика».?

Комментарии:

1. Извините за мою двусмысленность. В настоящее время график слишком широк для отображения. Я установил RankDir.BOTTOM_TO_TOP , но я не могу изменить расстояние между узлами и ребрами. Другой вопрос, можно ли установить некоторую стратификацию графа таким образом, чтобы некоторые узлы размещались на определенном уровне. Документация этой библиотеки, на которую я ссылаюсь, — это только часть readme на странице GitHub, есть ли еще ссылки?