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 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) >>> 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 官方文档