E go График для списка вершин в Networkx - PullRequest
1 голос
/ 30 марта 2020

У меня есть двудольный граф с такими узлами, как (a1, a2, ... a100, m1, m2, ...). Я хочу найти индуцированный подграф для определенных узлов, скажем (a1, a2 и a10). Я могу сделать это с помощью networkx.ego_graph, но он принимает одну вершину за раз и возвращает индуцированный граф. Я хочу знать, есть ли способ сделать это сразу для всех интересующих меня узлов, а затем выбрать самый большой.

1 Ответ

2 голосов
/ 30 марта 2020

Давайте создадим пример двудольного графа:

import networkx as nx

B = nx.Graph()
B.add_nodes_from([1, 2, 3, 4, 5, 6], bipartite=0)
B.add_nodes_from(['a', 'b', 'c', 'j', 'k'], bipartite=1)
B.add_edges_from([(1, 'a'), (1, 'b'), (2, 'b'), (2, 'c'), (3, 'c'), (4, 'a'), 
                  (2, 'b'), (3, 'a'), (5, 'k'), (6, 'k'), (6, 'j')])


rcParams['figure.figsize'] = 12, 6
nx.draw(B, node_color='lightblue', 
        with_labels=True)

enter image description here

Итак, мы хотим выбрать среди следующего списка узлов:

l = [1,'a',6]

Похоже, вы хотите выбрать тот, который имеет наивысшую степень центральности среди них. Для этого вы можете сделать:

deg_l = {i:B.degree(i) for i in l}    
highest_centrality_node = max(deg_l.items(), key=lambda x: x[1])[0]

Теперь мы можем построить соответствующий ego_graph с:

ego_g = nx.ego_graph(B, highest_centrality_node)
d = dict(ego_g.degree)
nx.draw(ego_g, node_color='lightblue', 
        with_labels=True, 
        nodelist=d, 
        node_size=[d[k]*300 for k in d])

enter image description here

...