как рисовать петли с помощью Networkx и matplotlib в Python

Я использую networkx и пытаюсь найти циклы на графиках. Я написал следующий код:

import networkx as nx
import matplotlib.pyplot as plt
import pylab

tg = nx.Graph()

h_lat_dir = {1: [("A", "A"), ("B", "B"), ("A", "B")], 2: [("C", "D")],
    3: [("C", "F")], 4: [("F", "F")], 5: [("C", "C"), ("C", "E"), ("D", "E"), ("E", "E")],
    6: [("D", "D")]}

for wght, edgelist in h_lat_dir.iteritems():
    tg.add_edges_from(edgelist, weight=wght)

print nx.cycle_basis(tg)


nx.write_dot(tg, 'multi.dot')
nx.draw_graphviz(tg)
pylab.show()

результат

[['A'], ['B'], ['C'], ['F'], ['E', 'D', 'C'], ['D'], ['E']]

и этот рисунок введите здесь описание изображения

Почему я не вижу self_loops? (каждая вершина по одной) Можно ли их как-то нарисовать?


person Yannis    schedule 25.05.2014    source источник
comment
Если вы можете использовать graphviz, вот подход (требуется pygraphviz или pydot) stackoverflow.com/questions/22312334/   -  person Aric    schedule 26.05.2014
comment
Приведенный вами пример работает на Digraph. Мой ненаправленный.   -  person Yannis    schedule 26.05.2014


Ответы (1)


Использование интерфейса NetworkX для Graphviz (через pygraphviz или pydot):

import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_edges_from([(0,1), (0,2), (1,1), (1,2)])
nx.write_dot(G,'graph.dot')

Затем запустите

dot -Tpng graph.dot > graph.png

введите здесь описание изображения

person Aric    schedule 26.05.2014
comment
Я копирую и вставляю ваш код, запускаю команду и все равно получаю направленный график - без зацикливания??? - person Yannis; 27.05.2014
comment
Не могли бы вы показать выходной файл точек и связанный с ним рисунок? - person Aric; 27.05.2014
comment
graph.dot: строгий орграф { 0 -> 1; 0 -> 2; 1 -> 2; } и изображение (как его сюда залить???) такое же, как у вас с направленными краями 0->1 0->2 1->2 и без края 1->1 - person Yannis; 28.05.2014
comment
Кажется, что-то не так с установкой pygraphviz или pydot (не уверен, какой из них вы используете). Если вы используете nx.Graph() и отправляете его в nx.write_dot(), вы должны получить график, а не диграф в точечном выводе. - person Aric; 29.05.2014
comment
Грустно, что это все еще невозможно сделать много лет спустя =( Я надеялся, что networkx был инструментом для перехода от graphviz, я хочу иметь какой-то простой способ интерактивно рисовать графики на основе матрицы adj и генерировать точки и обрабатывать их с помощью graphviz нельзя. - person Dan M.; 29.09.2016