Подсчет ребер между узлами в сетиx - PullRequest
1 голос
/ 04 октября 2019

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

import networkx as nx
nodes = [0,1]
edges = [(0,1),(1,0)]
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
weights = [2,3]
nx.draw(G, width = weights)

Я быхотелось бы, чтобы ширина от 0 до 1 была равна 5, так как это сумма веса.

1 Ответ

1 голос
/ 06 октября 2019

Сначала вам нужно создать MultiDiGraph и добавить к нему все возможные ребра. Это связано с тем, что он поддерживает несколько направленных egdes между одним и тем же набором узлов, включая самопетли.

import networkx as nx
nodes = [0, 1, 2, 3, 4, 5]
edges = [(0,1), (1,0), (1, 0),(0, 1), (2, 3), (2, 3), (2, 3), (2, 3),
         (4, 1), (4, 1), (4, 1), (4, 1), (4, 1), (4, 1), (4, 5), (5, 0)]
G = nx.MultiDiGraph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)

Затем создайте словарь, содержащий счетчики каждого ребра

from collections import Counter
width_dict = Counter(G.edges())
edge_width = [ (u, v, {'width': value}) 
              for ((u, v), value) in width_dict.items()]

Теперь создайтеnew DiGraph из словаря edge_width, созданного выше

G_new = nx.DiGraph()
G_new.add_edges_from(edge_width)

Печать с использованием утолщенных граней

Это расширение ответа, упомянутого здесь .

edges = G_new.edges()
weights = [G_new[u][v]['width'] for u,v in edges] 
nx.draw(G_new, edges=edges, width=weights)

enter image description here

Добавить метки Edge

См. этот ответ для получения дополнительной информации.

pos = nx.spring_layout(G_new)
nx.draw(G_new, pos)
edge_labels=dict([((u,v,),d['width'])
             for u,v,d in G_new.edges(data=True)])

nx.draw_networkx_edges(G_new, pos=pos)
nx.draw_networkx_edge_labels(G_new, pos, edge_labels=edge_labels,
                             label_pos=0.25, font_size=10)

enter image description here

Вы также можете просмотреть этот Google Colab Notebook с рабочим кодом.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...