1. NetworkX简介
NetworkX 是一个用于创建、操作和研究复杂网络的 Python 库。它可以创建、分析和可视化各种类型的网络(包括有向图和无向图),例如社交网络、Web图、生物网络等。
NetworkX 提供了许多图的算法和分析工具,比如节点的度、网络的直径、最短路径等。还可以使用它来发现社区结构、进行图的聚类分析等。
2. 有向图的绘制及遍历
2.1 有向图绘制
# -*- coding: utf-8 -*-
import networkx as nx
import matplotlib.pyplot as plt# 创建空的有向图的对象
G = nx.DiGraph()
# 添加节点
G.add_node('A')
G.add_node('B')
G.add_nodes_from(['C', 'D', 'E'])
# 添加有向边
G.add_edge('A', 'B')
G.add_edges_from([('B','C'),('B', 'D'),('C', 'E')]) # 进行图的绘制
layout = nx.spring_layout(G) # 利用Fruchterman-Reingold force-directed算法生成节点布局
nx.draw(G, layout, with_labels=True)
plt.show()
如下:
其他常见展示布局
layout = nx.circular_layout(G) # 生成圆形节点布局
layout = nx.random_layout(G) # 生成随机节点布局
layout = nx.shell_layout(G) # 生成同心圆节点布局
layout = nx.spectral_layout(G) # 利用图拉普拉斯特征向量生成节点布局
layout = nx.kamada_kawai_layout(G) # 使用Kamada-Kawai路径长度代价函数生成布局
2.2 有向图遍历
print(G.nodes) # 节点列表
# ['A', 'B', 'C', 'D', 'E']
print(G.edges) # 边列表
# [('A', 'B'), ('B', 'C'), ('B', 'D'), ('C', 'E')]
for node in G.nodes():print("节点>>>", node)in_degree = G.in_degree(node)print("入度:", in_degree)out_degree = G.out_degree(node)print("出度:", out_degree)neighbors = G.neighbors(node)print("邻居节点:", list(neighbors))
3. 带权重的边
3.1 绘制带权重的边
G = nx.DiGraph()
# 直接创建边(包括两个节点), 并设置边的权重
G.add_edge('A', 'B', weight=3)
G.add_weighted_edges_from([('B','C',5), ('C','D',2), ('C','E',5)])# ---进行图的绘制---
layout = nx.spring_layout(G) # 选择布局算法;
# 获取边的权重
labels = nx.get_edge_attributes(G, 'weight')
# {('A', 'B'): 3, ('B', 'C'): 5, ('C', 'D'): 2, ('C', 'E'): 5}
# 绘制带有权重的边
nx.draw(G, layout, with_labels=True)
nx.draw_networkx_edge_labels(G, layout, edge_labels=labels) # 添加权重
plt.show()
如下:
打印边的权重值
# 获取边的权重值列表
print(labels.values())
# dict_values([3, 5, 2, 5])
print("最大权重的边:", max(weights))
print("最小权重的边:", min(weights))
3.2 最短|长路径
# 两点之间最短路径
def get_shortest_path(graph, source, target):try:shortest_path = nx.shortest_path(graph, source, target)return shortest_pathexcept nx.exception.NetworkXNoPath:return "不存在最短路径"# 两点之间最长路径
def get_longest_path(graph, source, target):all_paths = nx.all_simple_paths(graph, source, target)longest_path = max(all_paths, key=len)return longest_path
实验
G = nx.DiGraph()
G.add_edge('A', 'B', weight=3)
G.add_edge('A', 'C', weight=5)
G.add_edge('B', 'C', weight=2)
G.add_edge('B', 'D', weight=4)
G.add_edge('C', 'D', weight=1)# 输出边权重
for u, v, data in G.edges(data=True):print(u, v, data)print("最短路径:", get_shortest_path(G, 'A', 'D'))
# ['A', 'B', 'D']
print("最长路径:", get_longest_path(G, 'A', 'D'))
# ['A', 'B', 'C', 'D']# 按照权重求取最短路径
print("最短路径:", nx.dijkstra_path(G, 'A', 'D', weight='weight'))
# ['A', 'C', 'D']
print("最短距离:", nx.dijkstra_path_length(G, 'A', 'D', weight='weight'))
# 6