type
status
date
slug
summary
tags
category
icon
password
Property
图的基本概念
- 图(Graph):图是由若干顶点和连接顶点的边所构成关系结构
- 顶点(Node):图中的点称为顶点,也称节点
- 边(Edge):顶点之间的连线,称为边
- 平行边(Parallel edge):起点相同、终点也相同的两条边称为平行边
- 循环(Cycle):起点和终点重合的边称为循环
- 有向图(Digraph):图中的每条边都带有方向,称为有向图
- 无向图(Undirected graph):图中的每条边都没有方向,称为无向图
- 赋权图(Weighted graph):图中的每条边都有一个或多个对应的参数,称为赋权图。该参数称为这条边的权,权可以用来表示两点间的距离、时间、费用
- 度(Degree):与顶点相连的边的数量,称为该顶点的度
图、顶点和边的操作
Networkx很容易创建图、向图中添加顶点和边、从图中删除顶点和边,也可以查看、删除顶点和边的属性
图的创建
Graph() 类
、DiGraph() 类
、MultiGraph() 类
和 MultiDiGraph() 类
分别用来创建:无向图、有向图、多图和有向多图:class Graph(incoming_graph_data=None, **attr)
顶点的添加、删除和查看
图的每个顶点都有唯一的标签属性(label),可以用整数或字符类型表示,顶点还可以自定义任意属性
顶点的常用操作:添加顶点,删除顶点,定义顶点属性,查看顶点和顶点属性:
Graph.add_node(node_for_adding, **attr)
Graph.add_nodes_from(nodes_for_adding, **attr)
Graph.remove_node(n)
Graph.remove_nodes_from(nodes)
边的添加、删除和查看
边是两个顶点之间的连接,在 NetworkX 中边是由对应顶点的名字的元组组成
e=(node1,node2)
。边可以设置权重、关系等属性。边的常用操作:添加边,删除边,定义边的属性,查看边和边的属性。向图中添加边时,如果边的顶点是图中不存在的,则自动向图中添加该顶点。
Graph.add_edge(u_of_edge, v_of_edge, **attr)
Graph.add_edges_from(ebunch_to_add, **attr)
Graph.add_weighted_edges_from(ebunch_to_add, weight=‘weight’, **attr)
查看图、顶点和边的信息
图的属性和方法
图的方法
方法 | 说明 |
G.has_node(n) | 当图 G 中包括顶点 n 时返回 True |
G.has_edge(u, v) | 当图 G 中包括边 (u,v) 时返回 True |
G.number_of_nodes() | 返回 图 G 中的顶点的数量 |
G.number_of_edges() | 返回 图 G 中的边的数量 |
G.number_of_selfloops() | 返回 图 G 中的自循环边的数量 |
G.degree([nbunch, weight]) | 返回 图 G 中的全部顶点或指定顶点的度 |
G.selfloop_edges([data, default]) | 返回 图 G 中的全部的自循环边 |
G.subgraph([nodes]) | 从图 G1中抽取顶点[nodes]及对应边构成的子图 |
union(G1,G2) | 合并图 G1、G2 |
nx.info(G) | 返回图的基本信息 |
nx.degree(G) | 返回图中各顶点的度 |
nx.degree_histogram(G) | 返回图中度的分布 |
nx.pagerank(G) | 返回图中各顶点的频率分布 |
nx.add_star(G,[nodes],**attr) | 向图 G 添加星形网络 |
nx.add_path(G,[nodes],**attr) | 向图 G 添加一条路径 |
nx.add_cycle(G,[nodes],**attr) | 向图 G 添加闭合路径 |
图的绘制与分析
图的绘制
可视化是图论和网络问题中很重要的内容。NetworkX 在 Matplotlib、Graphviz 等图形工具包的基础上,提供了丰富的绘图功能。
基本绘图函数使用字典提供的位置将节点放置在散点图上,或者使用布局函数计算位置
方法 | 说明 |
draw(G[,pos,ax]) | 基于 Matplotlib 绘制 图 G |
draw_networkx(G[, pos, arrows, with_labels]) | 基于 Matplotlib 绘制 图 G |
draw_networkx_nodes(G, pos[, nodelist, . . . ]) | 绘制图 G 的顶点 |
draw_networkx_edges(G, pos[, edgelist, . . . ]) | 绘制图 G 的边 |
draw_networkx_labels(G, pos[, labels, . . . ]) | 绘制顶点的标签 |
draw_networkx_edge_labels(G, pos[, . . . ]) | 绘制边的标签 |
其中
nx.draw()
和 nx.draw_networkx()
是最基本的绘图函数,并可以通过自定义函数属性或其它绘图函数设置不同的绘图要求。draw(G, pos=None, ax=None, **kwds)
draw_networkx(G, pos=None, arrows=True, with_labels=True, **kwds)
常用的属性定义如下:
- ‘node_size’:指定节点的尺寸大小,默认300
- ‘node_color’:指定节点的颜色,默认红色
- ‘node_shape’:节点的形状,默认圆形
- '‘alpha’:透明度,默认1.0,不透明
- ‘width’:边的宽度,默认1.0
- ‘edge_color’:边的颜色,默认黑色
- ‘style’:边的样式,可选 ‘solid’、‘dashed’、‘dotted’、‘dashdot’
- ‘with_labels’:节点是否带标签,默认True
- ‘font_size’:节点标签字体大小,默认12
- ‘font_color’:节点标签字体颜色,默认黑色
图的分析
NetwotkX 提供了图论函数对图的结构进行分析:
子图
- 子图是指顶点和边都分别是图G的顶点的子集和边的子集的图
subgraph()
方法,按顶点从图 G 中抽出子图
连通子图
- 如果图 G 中的任意两点间相互连通,则 G 是连通图
connected_components()
方法,返回连通子图的集合
强连通
- 如果有向图 G 中的任意两点间相互连通,则称 G 是强连通图
strongly_connected_components()
方法,返回所有强连通子图的列表
弱连通
- 如果一个有向图 G 的基图是连通图,则有向图 G 是弱连通图
weakly_connected_components()
方法,返回所有弱连通子图的列表