Подтвердить что ты не робот

Интерактивная визуализация графа

Ситуация

Как и этот вопрос, я ищу способ создания графического интерфейса, в котором пользователи могут видеть график (в теория графов) и взаимодействовать с ним. Транспортные средства будут перемещаться по графику от ни одного до node со временем. Пользователи должны иметь возможность добавлять узлы и края и добавлять Транспортные средства и устанавливать их пункт назначения.

Я уже реализовал базовую модель графа и бизнес-логику, для этого мне нужен графический интерфейс. Это означает, что мне не нужны функции алгоритма графа, такие как алгоритм Джистры.

Если возможно, решение должно быть независимым от платформы. Основная модель написана на python, поэтому решение GUI должно быть основано на python (что было бы предпочтительнее) или должно легко взаимодействовать с python (потенциально IPC).

Производительность вызывает беспокойство. Это не должно быть ослепительно быстрым, но оно должно быть достаточно быстрым, чтобы не отставать от базовой модели. Понятно, что нет ограничений на количество узлов, ребер и транспортных средств, которые могут присутствовать на графике.

Возможные подходы

Я просмотрел различные библиотеки визуализации:

Я предполагал использовать OpenGL.

Я подумал о том, чтобы рисовать прямо на wxPython.

Проблемы

Я не использовал ни одну из библиотек графов. Я не знаю, способны ли они предоставить необходимую функциональность. Например, у matplotlib, как представляется, много диаграмм теории графов в галерее. Я не могу найти пример того, кто-то реализует граф с ним, помимо NetworkX. Например, можно ли объекты сети NetworkX перемещаться по краям?

Решение OpenGL почти наверняка потребует больше времени для реализации. Мне пришлось бы программировать функции для перемещения объектов по краям. Я должен был бы закодировать функцию для рисования ребер в нужном месте и рисовать метки для всех ребер и узлов и транспортных средств и т.д. Мне нужно было бы реализовать меню и обрабатывать взаимодействия с нуля.

Я не уверен, как я буду реализовывать это в wxPython. Я знаю, как использовать его в сочетании со стандартными виджетами. Обновление: Я нашел этот вопрос, у которого есть ответ, который указывает на wx.lib.ogl или wx.lib.floatcanvas в качестве механизма для реализации решения в чистом wxPython.

Вопросы

Выполняет ли какая-либо из библиотек визуализации мои требования? Из тех, которые делают, которые наиболее подходят? Есть ли другие библиотеки, которые я пропустил, которые отвечали бы моим требованиям? Что-то вроде JGraph, но для Python вместо Java было бы подходящим.

Каково ваше мнение о реализации этого в OpenGL или wxPython в отличие от одной из этих библиотек?

Существуют ли другие подходы, которые я не считал подходящими?

4b9b3361

Ответ 1

В итоге я обнаружил, что библиотеки визуализации, которые, как я считал, не могут анимировать объекты, перемещающиеся по краям.

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

Это довольно старый вопрос, поэтому теперь могут существовать другие библиотеки, которые выполняют это требование, или, возможно, библиотеки, которые я рассмотрел, уже продвинулись и теперь могут это сделать. Если бы мне пришлось реализовать его с нуля сегодня, я был бы склонен экспериментировать с веб-интерфейсом пользователя, потенциально используя веб-сокеты, чтобы не отставать от задней части с точки зрения скорости передачи данных. Я не знаю, насколько хорошо анимация будет масштабироваться, хотя я обнаружил, что Canvas и SVG становятся нестабильными при анимации большого количества вещей одновременно. Возможно, WebGL подойдет лучше.

Ответ 2

Вы можете рассмотреть библиотеку JavaScript d3. Он имеет фантастические интерактивные графические визуализации и написан на JavaScript, отлично подходит для веб-интерфейса.

Я не уверен в возможностях построения графика в реальном времени, но предполагаю, что простой node и добавление/удаление краев было бы тривиально реализовать поверх выбранного вами типа визуализации.

Конечно, вам потребуется что-то вроде pyjs для интерфейса d3 с вашим кодом на Python, поэтому он может оказаться неприемлем.

Относительно ответа на nmichaels: широко использовав GraphViz, я бы не рекомендовал его для вашей цели. Он генерирует красивые статические диаграммы, но строго неинтерактивен.

Ответ 3

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