сравнение фреймворков Java graph drawing с открытым исходным кодом (JUNG и Prefuse) для рисования сетевой топологии

StackOverflow https://stackoverflow.com/questions/4670846

Вопрос

какой из фреймворков Java graph drawing с открытым исходным кодом использовать для построения сетевой диаграммы со следующими требованиями?График будет содержать менее 1000 узлов.

1) имеет параллельные ребра
2) направленные и неориентированные ребра в пределах одного графа
3) узлы, представленные изображениями
4) взаимодействие пользователя с узлами и ребрами
5) динамическое добавление / удаление узлов и ребер
6) множественная маркировка на узлах и ребрах, различные уровни маркировки могут быть отключены / включены пользователями.(например, рисование слоями и выключение / включение слоя)
7) различные алгоритмы компоновки для отображения топологий звезд, колец, сеток

Я оценил Юнга и Префуза.Это то, что я нашел для каждого из моих требований.

1) Prefuse не может отображать параллельные ребра, пока JUNG поддерживает его.Можно ли манипулировать предварительным кодом для отображения параллельных ребер ?Поскольку это связано с изменениями базового уровня данных, я полагаю, что это было бы сложнее, чем обычные изменения пользовательского рендеринга.

2) Я не нашел никаких ссылок на комбинированный граф (как направленные, так и неориентированные ребра) как в prefuse, так и в JUNG.Кто-нибудь знает обратное?

3) Это кажется простым как с Prefuse, так и с JUNG

4) Опять же, и prefuse, и JUNG обеспечивают поддержку взаимодействия с пользователем.

5) И префуз, и ЮНГ поддерживают это.Как работает каждый фреймворк при перерисовке графика ?Я видел в другом посте, что prefuse плохо работает для динамических обновлений (Предварительный Набор инструментов:динамическое добавление узлов и ребер)

6) Это сводится к изменению графика и его перерисовке.Таким образом, вопрос становится таким же, как 5)

7) И JUNG, и prefuse имеют несколько алгоритмов компоновки.Но когда я попытался отобразить один и тот же набор данных с помощью FruchtermanReingoldLayout как в JUNG, так и в Prefuse, я получил разные дисплеи.Есть какие - нибудь идеи, почему ?Каким-то образом алгоритмы компоновки в Prefuse, похоже, отображают лучшую компоновку, чем в JUNG (я думаю, рендеринг тоже лучше), хотя большинство алгоритмов компоновки в Prefuse основаны на реализации JUNG.Предварительные макеты, такие как ForceDirectedLayout / FruchtermanReingoldLayout и CircleLayout, напрямую сопоставляются с топологиями звезда, круг, сетка.

Помимо этих требований, prefuse обладает хорошей поддержкой выражений и языка запросов, но, похоже, он не разрабатывается активно, в отличие от JUNG.у какого из них лучшая визуализация?Есть какие - нибудь предложения , какой из них подойдет и как устранить недостатки ?

Есть какие -нибудь другие фреймворки, которые я могу использовать?

Это было полезно?

Решение

Несколько лет назад (2007?) Я использовал prefuse для визуализации записей данных вызовов.Я рассмотрел prefuse, jung, jgraph и несколько других и выбрал prefuse.Поначалу мне было немного сложно разобраться с prefuse, но как только я с ним познакомился, его стало действительно легко (расширять) и интересно использовать.Я думаю, то же самое можно сказать и о Юнге, но я никогда этого не пробовал.

1) В prefuse очень легко добавить свой собственный инструмент визуализации для рисования параллельных ребер - вы можете создать подкласс EdgeRenderer по умолчанию и переопределить метод render().Никаких "изменений на уровне базовых данных" не требуется.Все это есть в части просмотра, если вы хотите думать об этом как о материале MVC.

2) На самом деле это вообще не проблема.Есть несколько способов сделать это:1) У вас может быть два средства визуализации - одно для рисования направленных ребер и одно для рисования неориентированных ребер, и они будут работать просто отлично и соответствующим образом группировать ребра.2) Установите флаг (добавьте логический столбец в кортеж таблицы поддержки в prefuse speak), чтобы указать, направлено ли ребро, и пропустите соответствующую часть рисования стрелки в EdgeRender в соответствии с этим флагом.

3) Это очень просто

4) то же самое

5) Последним предварительным выпуском является "prefuse beta release 2007.10.21".Я использовал предыдущий, который имеет возможное условие гонки при динамическом добавлении или удалении узлов - я думаю, в нем отсутствовало несколько синхронизированных ключевых слов.Я решил это, убедившись, что останавливаю всю анимацию и действия (цвет, размер, макет) при добавлении или удалении узлов - также не забудьте обновить свои индексы lucene (если вы используете встроенную поисковую систему lucene).Предполагается, что последняя версия решит проблему с гонкой, но у меня так и не было возможности опробовать ее.

6) Поскольку вы упомянули "множественную маркировку", я думаю, что это не вопрос "изменения графика и его перерисовки" - это просто вопрос настройки ваших средств визуализации меток / краев для рисования только соответствующих меток, так что на самом деле это не большая проблема.Также я не думаю, что это вообще связано с 5.

7) Я не удивлен, что рендеринг prefuse и JUNG's FruchtermanReingoldLayout отличаются - есть несколько факторов, которые могут повлиять на этот начальный узел, где каждая реализация запускает вычисление, поэтому я бы не стал сильно беспокоиться об этой проблеме.Довольно легко опробовать различные встроенные алгоритмы компоновки графиков в prefuse, так что вы можете пойти дальше и проверить, какой из них наиболее близок к тому, что вы хотели бы иметь.Ознакомьтесь с RadialLayout и BalloonTreeLayout для получения схемы расположения звезды.ForceDirectedLayout требует довольно много итераций, чтобы размещение узлов было "стабильным".Обратите внимание, что показывать эти итерации не обязательно, поэтому вы можете запустить их в фоновом режиме и отобразить конечный результат.

Я не пользовался JUNG, поэтому не могу много комментировать это.

Основываясь на моем опыте работы с prefuse, я настоятельно рекомендую его из-за очень хорошо (ИМХО) продуманного дизайна и разделения ответственности между компонентами.Джеффри Хир (автор предисловия) действительно проделал там хорошую работу.

На что следует обратить внимание, если вы используете prefuse (это две "болячки", которые я отчетливо помню при работе с prefuse):

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

2) При расширении встроенных макетов вы можете столкнуться с одной или двумя "проблемами области видимости", когда члену суперкласса, к которому вы хотели бы иметь доступ, присваивается атрибут private вместо protected, поэтому решение состоит в том, чтобы либо изменить саму библиотеку, либо создать новый класс без наследования (это может быть немного болезненно!).Я думаю, вы можете сказать то же самое о некоторых других библиотеках Java.Не у всех есть преимущество оглядываться назад, не так ли?:)

Поскольку вы задали этот вопрос около месяца назад (на момент написания этой статьи) Я хотел бы знать, каким было ваше решение и чем оно обернулось для вас, если вы продолжите реализацию.

Другие советы

Я один из создателей и соавторов Юнга, так что имейте в виду это для ответов ниже.

Во -первых, я должен сказать, что автор «Префуза» - друг друга (и да, мы встретились), и он проделал отличную работу. Меня не испытывают с префузом, но я видел некоторые красивые визуализации, созданные с ним.

Вот ответы на эти вопросы для Юнга. Некоторые из них ((1), (2), (4) продемонстрированы в PluggableRendererDemo:

  1. Поддерживается (вам понадобится правильная модель данных, не все параллельные ребра поддержки по соображениям производительности)
  2. Поддерживается (опять же, вам нужна правильная модель данных)
  3. Поддерживается (см ImageShaperDemo)
  4. Поддерживается (большинство демонстраций)
  5. Поддерживается (см GraphEditorDemo)
  6. Не поддерживается непосредственно, хотя вы, безусловно, можете динамически изменять этикетки и использовать HTML для рендеринга комплексных метков.
  7. Алгоритмы макета Юнга больше для общих сетей (за несколькими исключениями для деревьев и т. Д.). Однако вы, безусловно, можете построить свои собственные алгоритмы макета, и многие сделали это.

Надеюсь это поможет.

Я знаю, что вы указали Юнг и Префуз, но ... у меня был хороший опыт работы с Tomsawyer и Yfiles. Список требований, которые вы предложили, очень просты для этих двух - и они поддерживают гораздо больше.

Пробег

Я бы предложил оценить Jgraph слишком.

Мне нравится ответ @Holygeek. Вот моя реализация в решении для 2 (как направленных, так и неопределенных краев), для предварительной работы:

public class MyRenderFactory implements RendererFactory
{
    private NodeRenderer nodeRenderer = new NodeRenderer();
    private EdgeRenderer defaultEdgeRenderer = new EdgeRenderer();
    private EdgeRenderer undirectedEdgeRenderer = new EdgeRenderer(EdgeRenderer.EdgeType.LINE, EdgeRenderer.EdgeArrowType.NONE);

    public static String directedness = "myEdgeDirectedness";

    public enum EdgeDirected
    {
        directed, undirected;

        public static EdgeDirected fromIsDirected(boolean isDirected)
        {
            if (isDirected)
            {
                return directed;
            }
            return undirected;
        }
    }

    @Override
    public Renderer getRenderer(VisualItem<?> visualItem)
    {
        if (visualItem instanceof EdgeItem)
        {
            if (visualItem.get(directedness).equals(PrefuseGraphConverter.EdgeDirected.undirected))
            {
                return undirectedEdgeRenderer;
            }
            return defaultEdgeRenderer;
        }
        return nodeRenderer;
    }
}

... в другом месте, где создается график ...

MyRenderFactory.EdgeDirected directedness =
        MyRenderFactory.EdgeDirected.fromIsDirected(myEdge.isDirected());
prefuseEdge.set(MyRenderFactory.directedness, directedness);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top