Сравнение фреймворков рисования Java-кода с открытым исходным кодом (JUNG и Prefuse) для рисования топологии сети - PullRequest
27 голосов
/ 12 января 2011

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

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

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

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

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

3) Это похоже на Prefuse и JUNG

.

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

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

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 18 марта 2011

Я один из создателей и сопровождающих JUNG, так что помните об ответах ниже.

Во-первых, я должен сказать, что автор Prefuse - друг друга (и да, мы встретились) и он проделал большую работу.У меня нет опыта работы с Prefuse, но я видел несколько прекрасных визуализаций, созданных с его помощью.

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

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

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

3 голосов
/ 10 февраля 2011

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

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

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

3) Это супер просто

4) То же самое

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

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

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

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

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

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

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

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

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

2 голосов
/ 12 января 2011

Я знаю, что вы указали jung и prefuse, но ... У меня был хороший опыт работы с TomSawyer и yFiles.Список требований, который вы предложили, очень прост для этих двух - и они поддерживают гораздо больше.

Ран.

0 голосов
/ 22 марта 2017

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

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);
0 голосов
/ 13 января 2011

Я бы посоветовал оценить JGraph .

...