如何用NetworkX绘制Pandas DataFrame标签共现网络图
用NetworkX构建标签共现网络图
步骤1:准备数据
首先把你的label列的value_counts结果转换成可处理的格式。如果是从DataFrame获取,直接用:
label_counts = df_2020['label'].value_counts()
如果是测试数据,可手动构造(模拟你给出的2020年数据):
import pandas as pd import networkx as nx import matplotlib.pyplot as plt from itertools import combinations # 模拟label value_counts数据 data = { 'patch': 622, 'minor': 289, 'major.minor': 181, 'major.patch.minor': 175, 'major': 150, 'patch.minor': 144, 'major.patch': 95, 'pre': 53, 'dev': 11, 'minor.pre': 11, 'major.pre': 11, 'patch.minor.pre': 10, 'patch.pre': 7, 'major.minor.pre': 6, 'pre.dev': 6, 'minor.dev': 5, 'minor.pre.dev': 4, 'patch.minor.dev.': 3, 'major.patch.minor.dev': 4 } label_counts = pd.Series(data, name='count')
步骤2:统计标签间的共现权重
遍历每个标签,按.拆分后生成所有两两组合,累加每个组合的出现次数作为边的权重:
edge_weights = {} for label, count in label_counts.items(): # 拆分标签,过滤掉因末尾点产生的空字符串(比如"patch.minor.dev."拆分后会有空值) parts = [p for p in label.split('.') if p] # 生成所有无序两两组合(避免(u,v)和(v,u)被算作两条不同的边) for u, v in combinations(parts, 2): # 统一边的顺序,确保组合唯一 edge_key = tuple(sorted((u, v))) # 累加权重 edge_weights[edge_key] = edge_weights.get(edge_key, 0) + count
步骤3:构建NetworkX图
创建无向图,添加所有节点和带权重的边:
# 初始化无向图 G = nx.Graph() # 添加所有节点:收集所有拆分后的标签部分 all_nodes = set() for label in label_counts.index: all_nodes.update([p for p in label.split('.') if p]) G.add_nodes_from(all_nodes) # 添加带权重的边 for (u, v), weight in edge_weights.items(): G.add_edge(u, v, weight=weight)
步骤4:可视化网络图
通过调整节点大小、边宽等参数,让图更易读:
# 生成力导向布局,让节点分布更合理 pos = nx.spring_layout(G, k=0.15, iterations=20) # 根据边的权重设置边宽,根据节点的加权度设置节点大小 edge_width = [G[u][v]['weight'] * 0.05 for u, v in G.edges()] node_size = [1000 * G.degree(node, weight='weight') for node in G.nodes()] # 绘制图形 plt.figure(figsize=(12, 8)) nx.draw_networkx_nodes(G, pos, node_size=node_size, node_color='skyblue') nx.draw_networkx_edges(G, pos, width=edge_width, edge_color='gray') nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold') # 添加边的权重标签 edge_labels = {(u, v): G[u][v]['weight'] for u, v in G.edges()} nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=10) plt.axis('off') plt.show()
关键说明
- 用
combinations生成两两组合,确保每个标签对只统计一次 - 对边的两个节点排序,避免
(pre, dev)和(dev, pre)被当作不同边 - 处理拆分后出现的空字符串(比如末尾带
.的标签),避免无效节点 - 可视化时根据权重调整边宽和节点大小,让重要的连接和节点更突出
内容的提问来源于stack exchange,提问作者Brie MerryWeather
相关产品推荐
相关产品推荐

