如何使用networkx绘制子图
How to draw subgraph using networkx
我尝试根据节点名称列表从 karate_club_graph 中的 networkx 中绘制子图,但失败了。怎么画出我想显示的子图?
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()
你遇到的问题是你的子图命令告诉它用节点列表创建一个子图,其中每个元素不仅是节点名称,还有关于该节点名称的数据。命令 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()
在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)
给出一个元组列表,其中第一个条目是节点名称,第二个条目是显示关于这些节点的任何数据的字典。
我尝试根据节点名称列表从 karate_club_graph 中的 networkx 中绘制子图,但失败了。怎么画出我想显示的子图?
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()
你遇到的问题是你的子图命令告诉它用节点列表创建一个子图,其中每个元素不仅是节点名称,还有关于该节点名称的数据。命令 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()
在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)
给出一个元组列表,其中第一个条目是节点名称,第二个条目是显示关于这些节点的任何数据的字典。