一、创建有向图和无向图
(1)图的基本创建
import networkx as nx
# 无向图
G = nx.Graph() # 创建空的无向图
H = nx.Graph([(0,1),(1,2),(2,3)]) # 创建无向图时添加边
# 有向图
M = nx.DiGraph()
# 无向图转为有向图;
M = nx.DiGraph(H)
# 默认建图函数
H = nx.path_graph(10) # 创建0-9的无向图,相邻相接
nx.add_path(G,[1,2,3,4])
G=nx.graph_atlas(100)
(2)图的属性
G=nx.Graph(day='Friday') # 设置图的属性
G.graph # 查看图的所有属性{'day': 'Friday'}
G.graph['day'] = 'Monday' # 修改图的某个属性
G.graph['name'] = 'time' # 增加图的属性
二、结点/边
(1)查看结点/边
# 结点
G.number_of_nodes() # 查看结点总个数
G.nodes() # 查看所有节点
# 边
G.number_of_edges() # 查看边总个数
G.edges() # 查看所有边
(2)添加删除结点/边
# 添加单个结点
G.add_node(1)
G.add_node('H')
G.add_node(H)
# 添加多个结点
G.add_nodes_from([2,3])
G.add_nodes_from(H) # 等同于G.add_node(H)
G.add_nodes_from("abc") # 注意!添加的是元素a,元素b,元素c
# 删除单个节点
G.remove_node(1) # 1结点删除后,1的边也会被自动删掉
# 删除多个节点
G.remove_nodes_from(['b','c','d'])
G.remove_nodes_from("spam")
# 添加单个边
G.add_edge(1,2)
# 添加多个边或者某个图的边
G.add_edges_from([(1,2),(2,3)])
G.add_edges_from(H.edges())
# 删除单个边
G.remove_edge(2,3)
# 删除多个边
G.remove_edgesfrom([(2,3),(1,2)])
# 添加带权重的多个边
FG.add_weighted_edges_from([(1,2,0.125),(1,3,0.75),(2,4,1.2),(3,4,0.375)])
# 清空图
G.clear()
(3)结点/边的属性
# 边
G.add_edges_from([(3,'a',{'weight':10}), (4,'b',{'length':3})]) # 添加边时设置属性
G[1][3]['color']='blue' # 设置边(1,3)的color属性
G.edges[1,3] # 显示边(1,3)的所有属性,等同于G[1][2]
G.edges.data() # 显示所有边的属性信息
G.edges.data('weight') # 显示所有边的权重属性
# 结点
G.add_nodes_from([3],time='2pm') # 用列表添加多个节点时设置同一属性
G.add_node(1,time='5pm')
G.nodes[1]['room']=714 # 给某个节点增加属性
G.adj[1] # 显示结点1的邻居,等同于G[1]
G.nodes.data() # 显示所有节点的属性信息
# 逐个遍历结点的所有邻居
for node,adjnodes in FG.adj.items():
for adj,eattr in adjnodes.items():
wt = eattr['weight']
if wt<0.5:print('%d,%d,%.3f'%(node,adj,wt))
三、度与邻居
# 度(无向图没有出入度)
G.degree()[1] # 查看无向图结点1的度
G.in_degree(2)
G.out_degree(2)
DG=nx.DiGraph()
DG.add_weighted_edges_from([(1,2,0.5),(3,1,0.75)])
DG.out_degree(1,weight='weight') # 查看有向图1结点的出边权重
DG.degree(1,weight='weight')
DG.degree(weight='weight')
nx.degree_histogram(G) # 显示图各个度下的结点个数
# 邻居
G.adj[1] # 查看结点1的邻居,等同于G[1]
G.adj.items() # 返回字典,内容为所有节点各自的邻居集合
list(G.neighbors(0)) # 查看结点0的所有邻居
list(nx.common_neighbors(G,0,33)) # 查看两个结点的共同邻居
四、画图
import pylab
import networkx as nx
G = nx.karate_club_graph()
labels = {}
for node in G.nodes():
labels[node] = str(node)
nx.draw(G,labels=labels)
pylab.show()
五、图的遍历搜索
# 深度优先
list(nx.dfs_edges(G,0))
# 先序遍历
list(nx.dfs_preorder_nodes(G,0))
# 后序遍历
list(nx.dfs_postorder_nodes(G,0))
参考:
https://www.csdn.net/tags/MtjaEg3sMTMyNTEtYmxvZwO0O0OO0O0O.html
https://wenku.baidu.com/view/b91b3612edfdc8d376eeaeaad1f34693daef1034.html