networkx 初探

在撰写论文的时候经常需要画类似网络连接图,networkx 是一个常用的网络分析包,我们使用它结合 matplotlib 来完成画图任务,下面介绍 networkx 的一些基本概念。

创建一个图

创建一个没有节点和边的图:

1
2
>>> import networkx as nx
>>> G=nx.Graph()

在 networkx 中 nodes 可以是任何可哈希的对象,包括 string/image/xml/graph等。

节点

向图中添加,读取节点有多种方式。

常用的方式添加节点:

1
2
>>> G.add_node(1)
>>> G.add_nodes_from([2,3])

通过载入 nbunchd 可迭代对象方式添加节点:

1
2
>>> H=nx.path_graph(10)
>>> G.add_nodes_from(H)

将图作为节点添加:

1
>>> G.add_node(H)

删除节点:

1
2
>>> G.remove_node(H)
>>> G.remove_nodes_from([1, 2, 3])

向图里添加边:

1
2
3
4
>>> G.add_edge(1,2)
>>> e=(2,3)
>>> G.add_edge(*e) # unpack edge tuple*
>>> G.add_edges_from([(1,2),(1,3)])

通过载入 nbunchd 可迭代对象方式添加边:

1
>>> G.add_edges_from(H.edges())

删除边:

1
2
3
>>> Graph.remove_edge(1, 2)
>>> Graph.remove_edges_from([(2, 3), (4, 5)])
>>> G.clear() # 删除所有边

查看边和节点:

1
2
3
4
5
6
>>> G.nodes()
['a', 1, 2, 3, 'spam', 'm', 'p', 's']
>>> G.edges()
[(1, 2), (1, 3)]
>>> G.neighbors(1)
[2, 3]

查看节点和边的个数:

1
2
3
4
>>> G.number_of_nodes()
8
>>> G.number_of_edges()
2

通过其他图的边创建图:

1
2
3
4
5
>>> H=nx.DiGraph(G)
>>> H.edges()
[(1, 2), (2, 1)]
>>> edgelist=[(0,1),(1,2),(2,3)]
>>> H=nx.Graph(edgelist)

访问边

访问邻边:

1
2
3
4
>>> G[1]
{2: {}}
>>> G[1][2]
{}

设置边属性:

1
2
>>> G.add_edge(1,3)
>>> G[1][3]['color']='blue'

添加属性

为图添加属性:

1
2
3
>>> G = nx.Graph(day="Friday")
>>> G.graph
{'day': 'Friday'}

为节点添加属性:

1
2
3
4
5
6
7
>>> G.add_node(1, time='5pm')
>>> G.add_nodes_from([3], time='2pm')
>>> G.node[1]
{'time': '5pm'}
>>> G.node[1]['room'] = 714
>>> G.nodes(data=True)
[(1, {'room': 714, 'time': '5pm'}), (3, {'time': '2pm'})]

为边添加属性:

1
2
3
4
5
>>> G.add_edge(1, 2, weight=4.7 )
>>> G.add_edges_from([(3,4),(4,5)], color='red')
>>> G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])
>>> G[1][2]['weight'] = 4.7
>>> G.edge[1][2]['weight'] = 4

有向图

networkx 提供了查看出度、入度、邻接节点等方法处理有向图。

1
2
3
4
5
6
7
8
9
10
>>> DG=nx.DiGraph()
>>> DG.add_weighted_edges_from([(1,2,0.5), (3,1,0.75)]) #构建有向图
>>> DG.out_degree(1,weight='weight') # 查看出度
0.5
>>> DG.degree(1,weight='weight') # 查看出度入度之和
1.25
>>> DG.successors(1) # 查看临界节点
[2]
>>> DG.neighbors(1)
[2]

参考:networkx 官方文档