一,创建图
在创建图之前,需要导入networkx模块,通常设置别名为nx;如果创建的图中,顶点之间的边没有方向,那么该图称作无向图。在创建图时,可以通过help(g)来获得图的帮助文档。
import networkx as nx
g=nx.Graph()#创建空的无向图
g=nx.DiGraph()#创建空的有向图
二,图的顶点
图中的每一个顶点Node都有一个关键的ID属性,用于唯一标识一个节点,ID属性可以整数或字符类型;顶点除了ID属性之外,还可以自定义其他的属性。
1,向图中增加顶点
在向图中增加顶点时,可以一次增加一个顶点,也可以一次性增加多个顶点,顶点的ID属性是必需的。在添加顶点之后,可以通过g.nodes()函数获得图的所有顶点的视图,返回的实际上NodeView对象;如果为g.nodes(data=True)的data参数设置为true,那么返回的是NodeDataView对象,该对象不仅包含每个顶点的ID属性,还包括顶点的其他属性。
g.add_node(1)
g.add_nodes_from([2,3,4])
g.nodes()
NodeView((1, 2,3,4))
在向图中添加顶点时,除ID属性之外,也可以向顶点中增加自定义的属性,例如,名称属性,权重属性:
g.add_node(1,name='n1',weight=1)
g.add_node(2,name='n2',weight=1.2)
2,查看顶点的属性
通过属性_node获得图的所有顶点和属性的信息,_node属性返回的是一个字典结构,字典的Key属性是顶点的ID属性,Value属性是顶点的其他属性构成的一个字典。
g._node
{1: {'name': 'n1', 'weight': 1}, 2: {'name': 'n2', 'weight': 1.2}, 3: {}, 4: {}}
g.nodes(data=True)
可以通过顶点的ID属性来查看顶点的其他属性:g.node[1]
{'name': 'n1', 'weight': 1}
g.node[1]['name']
//代码效果参考:https://v.youku.com/v_show/id_XNjQwMDM2NzExMg==.html
'n1 new'
通过g.nodes(),按照特定的条件来查看顶点:
list(g.nodes(data=True))
[(1, {'time': '5pm'}), (3, {'time': '2pm'})]
3,删除顶点
通过remove函数删除图的顶点,由于顶点的ID属性能够唯一标识一个顶点,通常删除顶点都需要通过传递ID属性作为参数。
g.remove_node(node_ID)
g.remove_nodes_from(nodes_list)
4,更新顶点
更新图的顶点,有两种方式,第一种方式使用字典结构的_update函数,第二种方式是通过索引来设置新值:
g._node[1].update({'name':'n1 new'})
g.node[1]['name']='n1 new'
{1: {'name': 'n1 new', 'weight': 1}, 2: {'name': 'n2', 'weight': 1.2}, 3: {}, 4: {}}
5,删除顶点的属性
使用del命令删除顶点的属性
del g.nodes[1]['room']
6,检查是否存在顶点
检查一个顶点是否存在于图中,可以使用 n in g方式来判断,也可以使用函数:
g.has_node(n)
三,图的边
图的边用于表示两个顶点之间的关系,因此,边是由两个顶点唯一确定的。为了表示复杂的关系,通常会为边增加一个权重weight属性;为了表示关系的类型,也会设置为边设置一个关系属性。
1,向图中增加边
边是由对应顶点的名称构成的,例如,顶点2和3之间有一条边,记作e=(2,3),通过add_edge(node1,node2)向图中添加一条边,也可以通过add_edges_from(list)向图中添加多条边;在添加边时,如果顶点不存在,那么networkx会自动把相应的顶点加入到图中。
g.add_edge(2,3)
g.add_edges_from([(1,2),(1,3)])
g.edges()
EdgeView([(1, 2), (1, 3), (2, 3)])
可以向边中增加属性,例如,权重,关系等:
g.add_edge(1, 2, weight=4.7, relationship='renew')
由于在图中,边的权重weight是非常有用和常用的属性,因此,networkx模块内置以一个函数,专门用于在添加边时设置边的权重,该函数的参数是三元组,前两个字段是顶点的ID属性,用于标识一个边,第三个字段是边的权重:
g.add_weighted_edges_from([(1,2,0.125),(1,3,0.75),(2,4,1.2),(3,4,0.375)])
在增加边时,也可以一次增加多条边,为不同的边设置不同的属性:
g.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])
2,查看边的属性
查看边的属性,就是查看边的数据(data),查看所有边及其属性:
g.edges(data=True)
EdgeDataView([(1, 2, {}), (1, 3, {}), (2, 3, {})])
查看特定的边的信息有两种方式:g[1][2]
g.get_edge_data(1,2)
{'weight': 0.125, 'relationship': 'renew', 'color': 'blue'}
3,删除边
边是两个顶点的ID属性构成的元组,通过 edge=(node1,node2) 来标识边,进而从图中找到边:
g.remove_edge(edge)
g.remove_edges_from(edges_list)
4,更新边的属性
通过边来更新边的属性,由两种方式,一种是使用update函数,一种是通过属性赋值来实现:
g[1][2]['weight'] = 4.7
g.edge[1][2]['weight'] = 4
//代码效果参考:https://v.youku.com/v_show/id_XNjQwMDM2NzEzMg==.html
g[1][2].update({"weight": 4.7})
g.edges[1, 2].update({"weight": 4.7})
5,删除边的属性
通过 del命令来删除边的属性
del g[1][2]['name']
6,检查边是否存在
检查一条边是否存在于图中
g.has_edge(1,2)