如何使用networkx绘制子图

Pet*_*xwl 4 python networkx

我尝试根据节点名称列表从networkx中的karate_club_graph绘制子图但是失败了.怎么能像我想要展示的那样绘制子图?

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()
Run Code Online (Sandbox Code Playgroud)

Joe*_*oel 12

您遇到的问题是您的子图命令告诉它创建一个带有nodelist的子图,其中每个元素不仅仅是节点名,还有关于该节点名的数据.该命令G.subgraph只需要节点名称列表.

解决这个问题的最简单方法就是

k = G.subgraph(res)
Run Code Online (Sandbox Code Playgroud)

即使其中的某些节点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_networkx(k, pos=pos)

othersubgraph = G.subgraph(range(6,G.order()))
nx.draw_networkx(othersubgraph, pos=pos, node_color = 'b')
pl.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

data=TrueG.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*
Run Code Online (Sandbox Code Playgroud)

所以G.nodes()只给出节点名称. G.nodes(data=True)给出一个元组列表,其中节点名称为第一个条目,dict显示第二个条目中有关这些节点的任何数据.