如何用Python创建以用户为节点、共享人员度数为边的NetworkX网络图
解决NetworkX创建用户共享人员网络图的问题
1. 读取并整理CSV数据
先通过pandas读取CSV,把每个用户对应的关联人员整理成集合,方便后续计算交集:
import pandas as pd import networkx as nx import matplotlib.pyplot as plt from itertools import combinations # 替换为你的CSV文件路径,假设列名为User(用户)和Person(关联人员) df = pd.read_csv('your_data.csv') # 按用户分组,将每个用户对应的关联人员转为集合 user_related_persons = df.groupby('User')['Person'].apply(set).to_dict()
2. 创建图并添加节点
直接把所有用户作为节点加入图中:
G = nx.Graph() # 添加所有用户节点 G.add_nodes_from(user_related_persons.keys())
3. 计算共享人员数并添加边
遍历所有用户对,计算他们关联人员集合的交集大小(即共享人员数),大于0时添加边,边的权重设为共享人数:
# 用combinations生成所有不重复的用户对 for user1, user2 in combinations(user_related_persons.keys(), 2): shared_count = len(user_related_persons[user1] & user_related_persons[user2]) if shared_count > 0: G.add_edge(user1, user2, weight=shared_count)
4. 绘制带权重的网络图
可以根据边的权重设置边的粗细,节点大小用度数(或加权度数)区分:
# 获取节点的普通度数(连接的边数) node_degrees = dict(G.degree()) # 获取边的权重,用来设置边的粗细 edge_weights = [d['weight']*2 for (u, v, d) in G.edges(data=True)] # 节点大小基于度数缩放 node_sizes = [deg*150 for deg in node_degrees.values()] # 固定布局种子,保证每次画图位置一致 pos = nx.spring_layout(G, seed=123) # 绘制节点、边、标签 nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color='#87CEEB') nx.draw_networkx_edges(G, pos, width=edge_weights, alpha=0.6) nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold') # 显示边的共享人数标签 edge_labels = nx.get_edge_attributes(G, 'weight') nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=10) plt.axis('off') plt.show()
5. 获取图中的度数
- 普通度数:指节点连接的边的数量(即该用户和多少其他用户有共享人员)
# 所有节点的普通度数 print("普通度数:", dict(G.degree())) # 单个用户的普通度数,比如用户A print("用户A的普通度数:", G.degree('A'))
- 加权度数:指该用户所有连接边的权重之和(即该用户总共共享的人员总数)
# 所有节点的加权度数 print("加权度数:", dict(G.degree(weight='weight'))) # 单个用户的加权度数 print("用户A的加权度数:", G.degree('A', weight='weight'))
内容的提问来源于stack exchange,提问作者hansa
相关产品推荐
相关产品推荐

