Сохранение объекта графа networkx с неуникальными узлами в виде файла graphviz

Я хочу сохранить в файле graphviz объект networkx с неуникальными узлами. Я создал неуникальные узлы в networkx, используя метки. Но он просто может отображать узлы с неуникальными метками.

G = nx.MultiDiGraph()
G.add_node(0)
G.add_node(1)
G.add_node(2)
labels = {0: 'a', 1: 'b', 2: 'a'}
pos=nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos)
nx.draw_networkx_edges(G,pos)
nx.draw_networkx_labels(MG,pos,labels,font_size=16)

Это дает возвращаемое значение последнего оператора и результат:


return value: {0: Text(-0.6135625730904766, -0.6074010681652476, 'a'),
 1: Text(0.9319946933900001, -0.3925989318347525, 'b'),
 2: Text(-0.31843212029952345, 1.0, 'a')}

вывод networkx

Есть ли способ взять этот вывод из draw_networkx_labels и использовать его для создания файла graphviz. Мне нужны неуникальные узлы в выводе файла graphviz. Я пытаюсь сделать что-то вроде ниже:

x = nx.draw_networkx_labels(G,pos,labels,font_size=16)
write_dot(x, "dot.gv")
s = Source.from_file('dot.gv')
s.view()

Это вызовет ошибку, поскольку nx.draw_networkx_labels не возвращает объект, который он напечатал выше. Если я просто использую объект G, он не будет использовать метки «a» и «b». Кроме того, есть ли более простой способ создать неуникальные узлы в networkx?


person Aishwarya Radhakrishnan    schedule 03.11.2019    source источник


Ответы (1)


Вы путаете nodes с node labels. Нет смысла добавлять повторяющиеся узлы в граф. Однако вы можете добавлять неуникальные метки к существующим узлам Graph.

Взгляните на этот код:

import networkx as nx

G = nx.MultiDiGraph()
G.add_nodes_from(list(range(5)))

labels = {
    0: 'a',
    1: 'b',
    2: 'a',
    3: 'c',
    4: 'd'}

G.add_edge(0, 1)
G.add_edge(2, 1)
G.add_edge(3, 2)
G.add_edge(3, 4)

# Add the labels as a separate attribute in each node
nx.set_node_attributes(G, labels, 'label')

pos=nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos)
nx.draw_networkx_edges(G,pos)
nx.draw_networkx_labels(G,pos,labels,font_size=16)

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

Теперь переходим к сохранению графика в формате файла graphviz:

from networkx.drawing.nx_agraph import write_dot
from graphviz import Source

write_dot(G, "dot.gv")
Source.from_file('dot.gv')

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

Как вы можете видеть в соответствии с вашим вопросом, имена меток сохранены. Вы можете дополнительно прочитать документацию pygraphviz для дальнейшего управления полученным графиком.

Использованная литература:

Вы можете проверить эту записную книжку Google Colab для кода, показанного выше.

person Gambit1614    schedule 04.11.2019