如何用Python将加州路网数据转为有向图并开展图分析?
使用Python分析加州路网数据集(SNAP)
核心工具:NetworkX库
NetworkX是Python中专门用于图分析的工具库,能轻松处理路网这类无向/有向图,支持度分布、聚类系数等常用分析指标的快速计算。
步骤1:安装依赖库
先安装所需的工具包:
pip install networkx pandas numpy matplotlib
networkx:核心图处理库pandas:读取文本/Excel格式的数据集numpy:处理邻接矩阵matplotlib:可视化度分布(可选)
步骤2:读取数据集
情况A:读取原始SNAP文本文件
原始文本文件开头包含注释行(# FromNodeId ToNodeId),用pandas跳过注释行读取:
import pandas as pd # 读取文本文件,跳过以#开头的行,自动识别空格分隔符 df = pd.read_csv("california_road_network.txt", comment="#", sep="\s+", names=["FromNodeId", "ToNodeId"])
情况B:读取Excel文件
如果已将数据集转换为Excel格式,直接读取:
df = pd.read_excel("california_road_network.xlsx")
步骤3:构建图对象
路网是双向连通结构,用NetworkX创建无向图实例:
import networkx as nx # 创建无向图实例 G = nx.Graph() # 从DataFrame中提取所有边并添加到图中 edges = list(zip(df["FromNodeId"], df["ToNodeId"])) G.add_edges_from(edges) # 查看图的基本信息 print(f"节点总数:{G.number_of_nodes()}") print(f"边总数:{G.number_of_edges()}")
若需处理有向路网,替换为nx.DiGraph()即可。
步骤4:生成邻接矩阵
稠密邻接矩阵(小网络适用)
import numpy as np adj_matrix = nx.to_numpy_array(G) print("稠密邻接矩阵示例:") print(adj_matrix[:5, :5]) # 仅展示前5x5的部分
稀疏邻接矩阵(大网络推荐)
加州路网节点数量较多,稀疏矩阵能大幅节省内存:
sparse_adj_matrix = nx.to_scipy_sparse_array(G) print("稀疏邻接矩阵形状:", sparse_adj_matrix.shape)
步骤5:计算度分布
度分布是图分析的基础指标,计算并可视化:
from collections import Counter import matplotlib.pyplot as plt # 获取所有节点的度数 degrees = [d for n, d in G.degree()] # 统计不同度数的节点数量 degree_counts = Counter(degrees) sorted_degrees = sorted(degree_counts.items()) # 可视化度分布 plt.bar([d for d, cnt in sorted_degrees], [cnt for d, cnt in sorted_degrees]) plt.xlabel("节点度数") plt.ylabel("节点数量") plt.title("加州路网节点度分布") plt.show()
步骤6:计算聚类系数
全局平均聚类系数
反映整个网络的聚集紧密程度:
avg_clustering = nx.average_clustering(G) print(f"全局平均聚类系数:{avg_clustering:.4f}")
单个节点的聚类系数
查看特定节点的局部聚集程度:
node_clustering = nx.clustering(G) # 示例:查看节点0的聚类系数 print(f"节点0的聚类系数:{node_clustering[0]:.4f}")
内容的提问来源于stack exchange,提问作者Aylin Naebzadeh
相关产品推荐
相关产品推荐

