Как нарисовать подграф с помощью networkx

Я пытаюсь сделать подграф из karate_club_graph в networkx на основе списка node'name, но не удалось. Как рисовать подграф, как я хочу показать?

import networkx as nx from matplotlib import pylab as pl G = nx.karate_club_graph() res = [0,1,2,3,4,5] new_nodes = [] for n in G.nodes(data=True): if n[0] in res: new_nodes.append(n) k = G.subgraph(new_nodes) pos = nx.spring_layout(k) pl.figure() nx.draw(k, pos=pos) pl.show() 

Проблема, с которой вы сталкиваетесь, заключается в том, что ваша команда subgraph сообщает ей сделать подграф с ноделистом, где каждый элемент является не только именем узла, но и данными об этом имени узла. Для команды G.subgraph нужен только список имен узлов.

Самый простой способ исправить это

 k = G.subgraph(res) 

который будет работать, даже если некоторые из узлов в res не находятся в G

Я сделаю это изменение, а также покажу, как рисовать несколько раз с последовательными позициями, добавляя дополнительный подграф для построения. Он построит ваш k а затем подграф, состоящий из всех узлов, не входящих в k . Обратите внимание, что между ними не будет никаких ребер, поскольку работает subgraph .

 import networkx as nx from matplotlib import pylab as pl G = nx.karate_club_graph() res = [0,1,2,3,4,5, 'parrot'] #I've added 'parrot', a node that's not in G #just to demonstrate that G.subgraph is okay #with nodes not in G. pos = nx.spring_layout(G) #setting the positions with respect to G, not k. k = G.subgraph(res) pl.figure() nx.draw(k, pos=pos) othersubgraph = G.subgraph(range(6,G.order())) nx.draw(othersubgraph, pos=pos, node_color = 'b') pl.show() 

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

Эффект наличия data=True в G.nodes() выглядит следующим образом:

 print G.nodes() > [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33] print G.nodes(data=True) > [(0, {'club': 'Mr. Hi'}), (1, {'club': 'Mr. Hi'}), (2, {'club': 'Mr. Hi'}), (3, {'club': 'Mr. Hi'}), (4, {'club': 'Mr. Hi'}), (5, {'club': 'Mr. Hi'}), (6, {'club': 'Mr. Hi'}), (7, {'club': 'Mr. Hi'}) ... *I've snipped stuff out* 

Так что G.nodes() просто дает имена узлов. G.nodes(data=True) дает список кортежей, которые имеют имя узла в качестве первой записи, а dict указывает любые данные об этих узлах во второй записи.