如何使用networkx绘制子图

5

我尝试从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()
1个回答

19

你遇到的问题是你的子图命令告诉它要使用一个节点列表,其中每个元素不仅是节点名称,还包括该节点名称的数据。命令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_networkx(k, pos=pos)

othersubgraph = G.subgraph(range(6,G.order()))
nx.draw_networkx(othersubgraph, pos=pos, node_color = 'b')
pl.show()

enter image description here

在调用G.nodes()时使用data=True的效果如下:

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)返回一个元组列表,其中第一项为节点名称,第二项是字典,显示该节点的任何数据。


你能告诉我什么时候以及为什么要将数据设置为true吗? - Peterxwl
我已经编辑了答案来解释它。基本上,data=True 的意思是它还提供了图形存储的有关节点的任何数据。 - Joel
我还有一个问题:实际上,我想实现的是,子图显示原始图中选择的节点,而它们的位置与原始图相同;但是通过上述方式,我发现子图的形状和位置已经改变了。您有任何想法实现这样的效果吗? - Peterxwl
执行 pos=nx.spring_layout(G)。然后 pos 是一个字典,其中 pos[u] 给出节点 ux,y 坐标。然后在绘制 k 时,使用该位置字典。 - Joel
最后 - 我刚刚检查了一下 G.subgraph(res),即使 res 中的某些节点不在 G 中,它也可以正常工作。 - Joel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接