#graphviz #graph-visualization
#graphviz #график-визуализация
Вопрос:
Я хотел бы реализовать график на Java. Я определил класс Node
и класс Edge
, и граф представлен списком узлов, и для каждого узла список ребер, начинающихся с узла, определяется как поле узла. Теперь я хотел бы использовать некоторую библиотеку 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, есть ли еще ссылки?