图的定义
图被记为 。
其中V是节点(node或vertex)的集合,E是边(edge或link)的集合。
有向图(directed graph or digraph):带箭头的边。
无向图(undirected graph):边不具备指向性。
案例:通过 NetworkX 创建一个简单的图
准备:安装第三方库
pip install networkx -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
绘制两个点,连接他们
# 导入包
import matplotlib.pyplot
import networkx
# 创建一个空图
graph = networkx.Graph()
# 添加节点1
graph.add_node(1)
# 添加节点2
graph.add_node(2)
# 添加节点1和2之间的边
graph.add_edge(1, 2)
# 绘制图形
networkx.draw(graph)
# 显示图形
matplotlib.pyplot.show()
add_edge:当添加的边对应的节点不存在的时候,自动创建相应的节点
# 导入包
import matplotlib.pyplot
import networkx
# 创建一个空图
graph = networkx.Graph()
# 如果没有定义点,将自动生成,如点2点3
graph.add_edge(2, 3)
# 绘制图形
networkx.draw(graph)
# 显示图形
matplotlib.pyplot.show()
默认创建无向图
# 导入包
import networkx
# 创建一个默认图
graph = networkx.Graph()
# 打印出图是否为有向图
print(graph.is_directed())
False
DiGraph():创建有向图
# 导入包
import networkx
# 创建一个有向图
graph = networkx.DiGraph()
# 打印出图是否为有向图
print(graph.is_directed())
True
添加权重,显示标签
import matplotlib.pyplot as plt
import networkx as nx
# 创建一个带权重的图
G = nx.Graph()
# 添加带权重的边
G.add_edge('A', 'B', weight=2)
G.add_edge('B', 'C', weight=3)
G.add_edge('C', 'D', weight=1)
G.add_edge('D', 'A', weight=4)
# 绘制图形并显示权重
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw(G, with_labels=True)
nx.draw_networkx_edge_labels(G, pos=nx.spring_layout(G), edge_labels=edge_labels)
plt.show()
图的性质
节点的邻接节点是与节点直接相连的节点。
无向图出度与入度相等。
平均度:无向图的平均度2倍边数量除以节点数量。
案例:网络平均度的计算
以NetworkX 中自带的图 The Karate Club Network(空手道俱乐部网络)为例
import matplotlib.pyplot as plt
import networkx as nx
# 绘制空手道俱乐部图
def draw_karate_club_graph():
# 创建空手道俱乐部图
G = nx.karate_club_graph()
# 显示图的类型
print(type(G))
# 绘制图,并显示节点标签
nx.draw(G, with_labels=True)
plt.show()
return G
# 计算网络的平均度
def average_degree(graph):
# 获取图的边数和节点数
num_edges = graph.number_of_edges()
num_nodes = graph.number_of_nodes()
# 计算平均度(每个节点的平均连接数)
avg_degree = 2 * num_edges / num_nodes
# 四舍五入后返回平均度的整数值
avg_degree = round(avg_degree)
return avg_degree
# 调用函数绘制空手道俱乐部图
G = draw_karate_club_graph()
# 计算并打印空手道俱乐部网络的平均度
avg_degree = average_degree(G)
print("空手道俱乐部网络平均度:{}".format(avg_degree))
<class 'networkx.classes.graph.Graph'>
空手道俱乐部网络平均度:5
行走:
从节点出发,依次经过边,最终到达 的行走。
行走节点是允许重复
路径是节点不可重复的行走。