networkx(通常写作 NetworkX)是 Python 中最流行、最强大的图论与复杂网络分析库,它为创建、操作、研究复杂网络的结构、动态和功能提供了丰富的工具。

什么是 NetworkX?
NetworkX 是一个用于图论计算的库,图是由节点和连接节点的边组成的数据结构。
- 节点:可以代表任何事物,如人、网页、城市、分子等。
- 边:代表节点之间的关系,如朋友关系、网页链接、航线、化学键等。
NetworkX 支持多种类型的图,包括:
- 无向图:边没有方向,关系是双向的(如朋友关系)。
- 有向图:边有方向,关系是单向的(如 Twitter 上的关注)。
- 加权图:边有权重,可以表示关系的强度或成本(如距离、费用)。
- 多重图:允许在两个节点之间存在多条边。
安装与导入
你需要安装这个库,可以使用 pip 进行安装:
pip install networkx
在 Python 代码中,通常这样导入:

import networkx as nx # "nx" 是 community 中约定俗成的简写
核心概念:图、节点、边
创建图
# 创建一个无向图 G = nx.Graph() # 创建一个有向图 # D = nx.DiGraph() # 创建一个加权图 # W = nx.Graph() # 创建一个多重图 # M = nx.MultiGraph()
添加节点
节点可以是数字、字符串、元组,甚至是任何可哈希的 Python 对象。
# 添加单个节点
G.add_node(1)
G.add_node("北京")
# 添加多个节点
G.add_nodes_from([2, 3, "上海", "广州"])
添加边
边通过连接两个节点来创建,如果节点不存在,NetworkX 会自动创建它们。
# 添加单条边
G.add_edge(1, 2)
G.add_edge("北京", "上海")
# 添加多条边
G.add_edges_from([(2, 3), ("上海", "广州"), (3, "北京")])
查看图的基本信息
# 打印所有节点
print("节点列表:", list(G.nodes()))
# 打印所有边
print("边列表:", list(G.edges()))
# 打印邻接表(节点及其邻居)
print("邻接表:", dict(G.adjacency()))
# 打印节点数和边数
print("节点数:", G.number_of_nodes())
print("边数:", G.number_of_edges())
可视化
NetworkX 本身不提供绘图功能,但它可以与 matplotlib 无缝集成,方便地进行可视化。
import matplotlib.pyplot as plt # 创建一个简单的图 G_s = nx.Graph() G_s.add_edges_from([(1, 2), (1, 3), (2, 3), (3, 4)]) # 绘制图形 nx.draw(G_s, with_labels=True, node_color='skyblue', node_size=1500, font_size=20, font_weight='bold') # 显示图形 plt.show()
输出图形:

核心功能与应用场景
NetworkX 的强大之处在于其丰富的算法和分析功能。
1 图的属性与计算
# 给节点添加属性
G.nodes[1]['color'] = 'red'
G.nodes[2]['population'] = 1000000
# 给边添加属性(权重)
G.add_edge("北京", "上海", weight=1200) # 距离约1200公里
G.add_edge("北京", "广州", weight=2200)
G.add_edge("上海", "广州", weight=1400)
# 访问节点和边的属性
print("节点1的属性:", G.nodes[1])
print("北京到上海的权重:", G.edges["北京", "上海"]["weight"])
# 计算度
# 对于无向图,度是与该节点相连的边的数量
print("节点的度:", dict(G.degree()))
# 输出: {1: 2, 2: 2, 3: 3, '北京': 2, '上海': 2, '广州': 2}
# 计算最短路径(需要图有权重)
shortest_path = nx.shortest_path(G, "北京", "广州", weight="weight")
print("北京到广州的最短路径:", shortest_path)
# 输出: ['北京', '上海', '广州'] (因为 1200+1400 < 2200)
# 计算最短路径长度
shortest_path_length = nx.shortest_path_length(G, "北京", "广州", weight="weight")
print("最短路径长度:", shortest_path_length)
# 输出: 2600
2 图的算法
NetworkX 实现了大量经典的图算法。
-
连通性
nx.is_connected(G): 检查图是否连通。nx.connected_components(G): 找出所有连通分量。
-
中心性
- 用来找出网络中“最重要”的节点。
nx.degree_centrality(G): 度中心性。nx.betweenness_centrality(G): 介数中心性。nx.pagerank(G): PageRank 算法(Google 早期用来对网页排序的算法)。
# 计算介数中心性 betweenness = nx.betweenness_centrality(G_s) print("介数中心性:", betweenness) # 输出: {1: 0.0, 2: 0.0, 3: 1.0, 4: 0.0} # 节点3连接了两个部分,最重要 -
社区发现
- 用来发现网络中联系紧密的节点群。
nx.greedy_modularity_communities(G): 基于模块度的贪心算法。
# 创建一个有社区结构的图 G_community = nx.karate_club_graph() # 一个经典的社交网络数据集 # 发现社区 communities = nx.greedy_modularity_communities(G_community) print(f"发现了 {len(communities)} 个社区。") for i, c in enumerate(communities): print(f"社区 {i+1}: {sorted(c)}") -
图匹配
nx.max_weight_matching(G): 在加权图中寻找最大权匹配。
3 生成图模型
NetworkX 可以方便地生成各种经典的随机图模型,用于模拟和研究。
-
随机图
nx.erdos_renyi_graph(n, p): ER 随机图模型,n个节点,每条边以概率p存在。
-
小世界网络
nx.watts_strogatz_graph(n, k, p): WS 小世界模型。
-
无标度网络
nx.barabasi_albert_graph(n, m): BA 无标度模型,n个节点,每个新节点连接到m个已存在的节点。
# 生成一个BA无标度网络 ba_graph = nx.barabasi_albert_graph(100, 5) # 可视化 plt.figure(figsize=(10, 8)) nx.draw(ba_graph, node_size=20) plt.title("Barabási-Albert 无标度网络") plt.show()
实际应用场景
NetworkX 的应用非常广泛,几乎涵盖了所有需要用图来表示问题的领域:
- 社交网络分析:
分析朋友关系、关注网络,发现意见领袖(中心性分析)、识别社群(社区发现)。
- 推荐系统:
将用户和物品表示为图中的节点,将用户行为(如购买、点击)表示为边,通过图算法(如“好友买了你也可能喜欢”)进行推荐。
- 交通与物流:
城市道路网、航线网络可以建模为图,最短路径算法用于导航,最小生成树算法用于铺设管网。
- 生物信息学:
蛋白质-蛋白质相互作用网络、基因调控网络,用于研究疾病和药物发现。
- 万维网分析:
网页作为节点,链接作为边,PageRank 算法用于网页排序。
- 网络安全:
分析网络流量,检测异常连接,发现潜在的安全威胁。
- 知识图谱:
构建和查询实体之间的关系网络。
示例:一个简单的社交网络分析
让我们结合以上知识,完成一个完整的小示例。
import networkx as nx
import matplotlib.pyplot as plt
# 1. 创建一个社交网络图(无向图)
social_network = nx.Graph()
# 2. 添加用户(节点)
users = ["Alice", "Bob", "Charlie", "David", "Eve", "Frank"]
social_network.add_nodes_from(users)
# 3. 添加好友关系(边)
# Alice是中心人物
social_network.add_edges_from([
("Alice", "Bob"),
("Alice", "Charlie"),
("Alice", "David"),
("Alice", "Eve"),
# Bob和Charlie也是朋友
("Bob", "Charlie"),
# Eve和Frank是朋友
("Eve", "Frank")
])
# 4. 可视化网络
plt.figure(figsize=(10, 8))
pos = nx.spring_layout(social_network, seed=42) # 为节点设置固定布局,使每次运行结果一致
# 绘制节点
nx.draw_networkx_nodes(social_network, pos, node_size=700, node_color='lightblue')
# 绘制边
nx.draw_networkx_edges(social_network, pos, width=2)
# 绘制标签
nx.draw_networkx_labels(social_network, pos, font_size=12, font_family='sans-serif')
"简单社交网络图")
plt.axis('off') # 关闭坐标轴
plt.show()
# 5. 分析网络
# 找出最受欢迎的人(度数最高)
degrees = dict(social_network.degree())
most_popular = max(degrees, key=degrees.get)
print(f"最受欢迎的人是: {most_popular}, 他有 {degrees[most_popular]} 个朋友。")
# 找出连接不同群体的关键人物(介数中心性最高)
betweenness = nx.betweenness_centrality(social_network)
most_important = max(betweenness, key=betweenness.get)
print(f"网络中最关键的人是: {most_important}, 他的介数中心性为 {betweenness[most_important]:.2f}。")
# 在这个简单例子中,Alice的度数和介数都是最高的。
# 检查网络是否连通
is_connected = nx.is_connected(social_network)
print(f"这个社交网络是连通的吗? {is_connected}")
| 特性 | 描述 |
|---|---|
| 易于上手 | API 设计直观,创建、添加节点和边非常简单。 |
| 功能强大 | 内置了大量经典的图论算法,从基本计算到复杂分析一应俱全。 |
| 灵活性好 | 节点和边可以是任何可哈希的 Python 对象,并能附加任意属性。 |
| 生态系统完善 | 与 matplotlib, pandas, numpy 等库无缝集成。 |
| 文档丰富 | 官方文档非常详尽,包含大量示例和教程。 |
如果你需要进行任何与图和网络相关的分析,networkx 都是你 Python 工具箱中不可或缺的一员。
