返回Skills库

NetworkX

MIT
📊 数据知识
K-Dense-AIPython可视化

使用NetworkX在Python中创建、分析和可视化复杂网络和图。在处理网络/图数据结构、计算图算法(最短路径、中心性、聚类)、检测社区、生成合成网络(随机、无标度、小世界)、读写图文件格式或绘制网络拓扑结构时使用。常见应用包括社交网络、生物网络、交通网络和引用网络。

NetworkX

概述

NetworkX是一个用于创建、操作和分析复杂网络和图的Python包。在处理网络或图数据结构时使用此技能,包括社交网络、生物网络、交通系统、引用网络、知识图谱或任何涉及实体之间关系的系统。

本技能针对 NetworkX 3.x(当前稳定版本:3.6,需要 Python >= 3.11)。若干 3.0 之前的 API(nx.infonx.write_gpicklenx.read_shp)以及 3.4 时代的 nx.random_tree 已不再存在——本技能通篇使用的是当前的替代方案。

何时使用此技能

在任务涉及以下内容时调用此技能:

  • 创建图: 从数据构建网络结构,添加具有属性的节点和边
  • 图分析: 计算中心性度量、查找最短路径、检测社区、测量聚类
  • 图算法: 运行标准算法,如Dijkstra算法、PageRank、最小生成树、最大流
  • 网络生成: 创建合成网络(随机、无标度、小世界模型)用于测试或模拟
  • 图I/O: 从各种格式读取或写入(边列表、GraphML、JSON、CSV、邻接矩阵)
  • 可视化: 使用matplotlib或交互式库绘制和自定义网络可视化
  • 网络比较: 检查同构、计算图度量、分析结构属性

核心功能

1. 图创建和操作

NetworkX支持四种主要图类型:

  • Graph: 具有单条边的无向图
  • DiGraph: 具有单向连接的有向图
  • MultiGraph: 允许节点之间多条边的无向图
  • MultiDiGraph: 具有多条边的有向图

通过以下方式创建图:

import networkx as nx

# 创建空图
G = nx.Graph()

# 添加节点(可以是任何可哈希类型)
G.add_node(1)
G.add_nodes_from([2, 3, 4])
G.add_node("protein_A", type='enzyme', weight=1.5)

# 添加边
G.add_edge(1, 2)
G.add_edges_from([(1, 3), (2, 4)])
G.add_edge(1, 4, weight=0.8, relation='interacts')

参考: 详见references/graph-basics.md获取关于创建、修改、检查和管理图结构的综合指导,包括使用属性和子图。

2. 图算法

NetworkX为网络分析提供了广泛的算法:

最短路径:

# 查找最短路径
path = nx.shortest_path(G, source=1, target=5)
length = nx.shortest_path_length(G, source=1, target=5, weight='weight')

中心性度量:

# 度中心性
degree_cent = nx.degree_centrality(G)

# 介数中心性
betweenness = nx.betweenness_centrality(G)

# PageRank
pagerank = nx.pagerank(G)

社区检测:

from networkx.algorithms import community

# 检测社区
communities = community.greedy_modularity_communities(G)

连通性:

# 检查连通性
is_connected = nx.is_connected(G)

# 查找连通分量
components = list(nx.connected_components(G))

参考: 详见references/algorithms.md获取所有可用算法的详细文档,包括最短路径、中心性度量、聚类、社区检测、流、匹配、树算法和图遍历。

3. 图生成器

创建合成网络用于测试、模拟或建模:

经典图:

# 完全图
G = nx.complete_graph(n=10)

# 环图
G = nx.cycle_graph(n=20)

# 已知图
G = nx.karate_club_graph()
G = nx.petersen_graph()

随机网络:

# Erdős-Rényi随机图
G = nx.erdos_renyi_graph(n=100, p=0.1, seed=42)

# Barabási-Albert无标度网络
G = nx.barabasi_albert_graph(n=100, m=3, seed=42)

# Watts-Strogatz小世界网络
G = nx.watts_strogatz_graph(n=100, k=6, p=0.1, seed=42)

结构化网络:

# 网格图
G = nx.grid_2d_graph(m=5, n=7)

# 随机树(random_tree 已在 NetworkX 3.4 中移除)
G = nx.random_labeled_tree(100, seed=42)

参考: 详见references/generators.md获取所有图生成器的综合覆盖,包括经典图、随机模型(Erdős-Rényi、Barabási-Albert、Watts-Strogatz)、格、树、社交网络模型和专用生成器,包含详细参数和用例。

4. 读取和写入图

NetworkX支持多种文件格式和数据源:

文件格式:

# 边列表
G = nx.read_edgelist('graph.edgelist')
nx.write_edgelist(G, 'graph.edgelist')

# GraphML(保留属性)
G = nx.read_graphml('graph.graphml')
nx.write_graphml(G, 'graph.graphml')

# GML
G = nx.read_gml('graph.gml')
nx.write_gml(G, 'graph.gml')

# JSON(节点-链接格式;自 NetworkX 3.6 起,边列表存储在 "edges" 键下——
# 旧文件可能使用 "links",详见 references/io.md)
data = nx.node_link_data(G)
G = nx.node_link_graph(data)

Pandas集成:

import pandas as pd

# 从DataFrame
df = pd.DataFrame({'source': [1, 2, 3], 'target': [2, 3, 4], 'weight': [0.5, 1.0, 0.75]})
G = nx.from_pandas_edgelist(df, 'source', 'target', edge_attr='weight')

# 到DataFrame
df = nx.to_pandas_edgelist(G)

矩阵格式:

import numpy as np

# 邻接矩阵
A = nx.to_numpy_array(G)
G = nx.from_numpy_array(A)

# 稀疏矩阵
A = nx.to_scipy_sparse_array(G)
G = nx.from_scipy_sparse_array(A)

参考: 详见references/io.md获取所有I/O格式的完整文档,包括CSV、SQL数据库、Cytoscape、DOT以及针对不同用例的格式选择指导。

5. 可视化

创建清晰且信息丰富的网络可视化:

基本可视化:

import matplotlib.pyplot as plt

# 简单绘制
nx.draw(G, with_labels=True)
plt.show()

# 使用布局
pos = nx.spring_layout(G, seed=42)
nx.draw(G, pos=pos, with_labels=True, node_color='lightblue', node_size=500)
plt.show()

自定义:

# 按度着色
node_colors = [G.degree(n) for n in G.nodes()]
nx.draw(G, node_color=node_colors, cmap=plt.cm.viridis)

# 按中心性调整大小
centrality = nx.betweenness_centrality(G)
node_sizes = [3000 * centrality[n] for n in G.nodes()]
nx.draw(G, node_size=node_sizes)

# 边权重
edge_widths = [3 * G[u][v].get('weight', 1) for u, v in G.edges()]
nx.draw(G, width=edge_widths)

布局算法:

# 弹簧布局(力导向)
pos = nx.spring_layout(G, seed=42)

# 圆形布局
pos = nx.circular_layout(G)

# Kamada-Kawai布局
pos = nx.kamada_kawai_layout(G)

# 谱布局
pos = nx.spectral_layout(G)

出版质量:

plt.figure(figsize=(12, 8))
pos = nx.spring_layout(G, seed=42)
nx.draw(G, pos=pos, node_color='lightblue', node_size=500,
        edge_color='gray', with_labels=True, font_size=10)
plt.title('Network Visualization', fontsize=16)
plt.axis('off')
plt.tight_layout()
plt.savefig('network.png', dpi=300, bbox_inches='tight')
plt.savefig('network.pdf', bbox_inches='tight')  # 矢量格式

参考: 详见references/visualization.md获取可视化技术的广泛文档,包括布局算法、自定义选项、使用Plotly和PyVis的交互式可视化、3D网络和出版质量图形创建。

使用NetworkX

安装

确保已安装NetworkX:

# 检查是否已安装
import networkx as nx
print(nx.__version__)

# 如需要则安装(通过bash)
# uv pip install networkx
# uv pip install networkx[default]  # 包含可选依赖

常见工作流程模式

大多数NetworkX任务遵循此模式:

  1. 创建或加载图:
   # 从头开始
   G = nx.Graph()
   G.add_edges_from([(1, 2), (2, 3), (3, 4)])

   # 或从文件/数据加载
   G = nx.read_edgelist('data.txt')
  1. 检查结构:
   print(f"Nodes: {G.number_of_nodes()}")
   print(f"Edges: {G.number_of_edges()}")
   print(f"Density: {nx.density(G)}")
   print(f"Connected: {nx.is_connected(G)}")
  1. 分析:
   # 计算度量
   degree_cent = nx.degree_centrality(G)
   avg_clustering = nx.average_clustering(G)

   # 查找路径
   path = nx.shortest_path(G, source=1, target=4)

   # 检测社区
   communities = community.greedy_modularity_communities(G)
  1. 可视化:
   pos = nx.spring_layout(G, seed=42)
   nx.draw(G, pos=pos, with_labels=True)
   plt.show()
  1. 导出结果:
   # 保存图
   nx.write_graphml(G, 'analyzed_network.graphml')

   # 保存度量
   df = pd.DataFrame({
       'node': list(degree_cent.keys()),
       'centrality': list(degree_cent.values())
   })
   df.to_csv('centrality_results.csv', index=False)

重要注意事项

浮点精度: 当图包含浮点数时,由于精度限制,所有结果本质上都是近似的。这可能会影响算法结果,特别是在最小/最大计算中。

内存和性能: 每次脚本运行时,图数据都必须加载到内存中。对于大型网络:

  • 使用适当的数据结构(大型稀疏图使用稀疏矩阵)
  • 考虑仅加载必要的子图
  • 使用高效的文件格式(Python对象使用pickle,压缩格式)
  • 利用近似算法处理非常大的网络(例如,中心性计算中的k参数)
  • 对于繁重的工作负载,NetworkX 3.x 通过 backend= 关键字参数或 nx.config.backend_priority 支持即插即用的加速后端——例如 nx-cugraph(GPU)、nx-parallel(多核)、graphblas-algorithms(稀疏线性代数)。安装相应的后端包,并在受支持的函数中传入 backend="cugraph"(或类似值)即可;无需修改算法代码。

节点和边类型:

  • 节点可以是任何可哈希的Python对象(数字、字符串、元组、自定义对象)
  • 使用有意义的标识符以提高清晰度
  • 删除节点时,所有关联的边会自动删除

随机种子: 始终为随机图生成和力导向布局设置随机种子以确保可重现性:

G = nx.erdos_renyi_graph(n=100, p=0.1, seed=42)
pos = nx.spring_layout(G, seed=42)

快速参考

基本操作

# 创建
G = nx.Graph()
G.add_edge(1, 2)

# 查询
G.number_of_nodes()
G.number_of_edges()
G.degree(1)
list(G.neighbors(1))

# 检查
G.has_node(1)
G.has_edge(1, 2)
nx.is_connected(G)

# 修改
G.remove_node(1)
G.remove_edge(1, 2)
G.clear()

基本算法

# 路径
nx.shortest_path(G, source, target)
nx.all_pairs_shortest_path(G)

# 中心性
nx.degree_centrality(G)
nx.betweenness_centrality(G)
nx.closeness_centrality(G)
nx.pagerank(G)

# 聚类
nx.clustering(G)
nx.average_clustering(G)

# 分量
nx.connected_components(G)
nx.strongly_connected_components(G)  # 有向

# 社区
community.greedy_modularity_communities(G)

文件I/O快速参考

# 读取
nx.read_edgelist('file.txt')
nx.read_graphml('file.graphml')
nx.read_gml('file.gml')

# 写入
nx.write_edgelist(G, 'file.txt')
nx.write_graphml(G, 'file.graphml')
nx.write_gml(G, 'file.gml')

# Pandas
nx.from_pandas_edgelist(df, 'source', 'target')
nx.to_pandas_edgelist(G)

资源

此技能包括综合参考文档:

references/graph-basics.md

关于图类型、创建和修改图、添加节点和边、管理属性、检查结构以及使用子图的详细指南。

references/algorithms.md

完整覆盖NetworkX算法,包括最短路径、中心性度量、连通性、聚类、社区检测、流算法、树算法、匹配、着色、同构和图遍历。

references/generators.md

图生成器的综合文档,包括经典图、随机模型(Erdős-Rényi、Barabási-Albert、Watts-Strogatz)、格、树、社交网络模型和专用生成器。

references/io.md

以各种格式读取和写入图的完整指南:边列表、邻接列表、GraphML、GML、JSON、CSV、Pandas DataFrames、NumPy数组、SciPy稀疏矩阵、数据库集成和格式选择指导。

references/visualization.md

可视化技术的广泛文档,包括布局算法、自定义节点和边外观、标签、使用Plotly和PyVis的交互式可视化、3D网络、二分布局和创建出版质量图形。

其他资源

  • 官方文档: https://networkx.org/documentation/latest/
  • 教程: https://networkx.org/documentation/latest/tutorial.html
  • 图库: https://networkx.org/documentation/latest/auto_examples/index.html
  • GitHub: https://github.com/networkx/networkx

兼容工具

Claude CodeOpenClawHermes Agent

数据来源:claude-scientific-skillsMIT 许可) | 查看上游来源

上游项目:K-Dense-AI/scientific-agent-skills / claude-scientific-skills | 收录时间:2026-08-18 | 更新:2026-08-18

本页面内容基于上游开源许可项目整理,仅供学习参考。AI铺子不对第三方内容承担责任, 详情请参阅免责声明