You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:13:08