Средство просмотра файлов Dot для живых обновлений с Python (через GraphViz)

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

Моя текущая реализация использует GraphViz и Python 3.6 в окне Windows и выводит его в файл .dot. В проекте Github я нашел программу просмотра под названием «gvuv», но она не поддерживает Python 3.6.

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

Пример графика:

graph = { "a" : set("c"),
      "b" : set("c", "e"),
      "c" : set("a", "b", "d", "e"),
      "d" : set("c"),
      "e" : set("c", "b"),
      "f" : set()
    } 

person Matt Kremer    schedule 17.01.2018    source источник


Ответы (2)


Поскольку ваш вопрос не совсем ясен, могу я спросить, хотите ли вы только визуализировать результат своего скрипта python? Вы ищете библиотеку Python для управления и визуализации графиков? Вы хотите сделать больше со своими графиками? Если ваша цель - просто построить графики и отобразить результат, почему бы не придерживаться graphviz и использовать Модуль Python GraphViz. Он позволяет строить от очень простых до сложных графиков и отображать результат в различных форматах. Простой пример из документации:

from graphviz import Digraph

# Create a directed graph
g = Digraph('G', filename='graph.gv', format='png')

# Add an edge between two nodes
# The nodes are created on the fly
g.edge('Hello', 'World')  

# Display the result
g.view()
# Render/save to disk
g.render()

Надеюсь, это поможет в ваших усилиях.

person domochevski    schedule 17.01.2018
comment
извините, я должен был подчеркнуть необходимость обновления в том же окне. Проблема с g.view () заключается в том, что он каждый раз открывает новый файл в отдельной программе просмотра. g.render () - это тот, который я в настоящее время использую для сохранения файла, но конечная цель состоит в том, чтобы иметь одно изображение / pdf / выходное представление какого-либо вида, в котором только края / узлы исчезают / появляются снова по мере их изменения в отдельная функция - person Matt Kremer; 18.01.2018
comment
Ваш poc проясняет, чего вы действительно хотите. Однако, насколько я понял, на данный момент такого визуализатора нет. Большинство проектов, которые существуют на github и близки к вашим требованиям, просто используют PyQt для отображения файла изображения, который обновляется снова и снова. Таким образом, решение, которое вы нашли с помощью JPEGViewer, проще всего реализовать. Тем не менее, вы можете попробовать PyQt, если вам нужно комплексное решение. - person domochevski; 18.01.2018

Вот что в итоге сработало. Я вывел файл как «png», а не как файл .dot (хотя я считаю, что подойдет любой тип файла изображения), а затем нашел в Интернете инструмент под названием «JPEGViewer", который автоматически обновит файл в том же окне, если файл был изменен в другом месте. Приведенный ниже код poc несколько раз меняет стрелку с черной на зеленую и обратно, а затем я могу использовать JPEGViewer в выходном файле для выполнения задачи.

from graphviz import Digraph
from time import sleep

dot = Digraph(comment='The Round Table', format='png', strict=True)

dot.node('A', 'one', color="red")
dot.node('B', 'two', color="red")
dot.node('C', 'three', color="red")
dot.node('D', 'four', color="red")
dot.node('E', 'five', color="red")
dot.node('F', 'six', color="red")
dot.node('G', 'device1', color="sienna")
dot.node('H', 'device2', color="green")




dot.edges(['AB', 'AG', 'AD', 'AE', 'BH', 'BC', 'BF'])
dot.edges(['BA', 'GA', 'DA', 'EA', 'HB', 'CB', 'FB'])
dot.edges(['CD', 'DC', 'EF', 'FE'])



while (True):
    dot.edge('H', 'B', color="black")
    sleep(.5)
    dot.render("TestGraphLiveUpdate")
    dot.view()
    dot.edge('H', 'B', color="green")
    sleep(.5)
    dot.render("TestGraphLiveUpdate")
    dot.view()
person Matt Kremer    schedule 18.01.2018