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

如何用NetworkX可视化ID群体随时间的演化过程?

用NetworkX可视化ID群体的时间演化过程

针对你的需求,我们可以基于NetworkX的多层分区布局,自定义节点与边的创建逻辑,实现ID群体随时间阶段的演化可视化,同时区分新增、留存和退出节点的样式。

完整实现代码

import networkx as nx
import matplotlib.pyplot as plt

# 定义各时间阶段的ID群体(可根据实际需求扩展)
time_stages = [
    [1, 2, 3],   # 第1阶段
    [1, 2, 4, 5], # 第2阶段
    [2, 4, 6]     # 第3阶段(可选,用于测试多阶段效果)
]

def build_temporal_graph(stages):
    """构建时间演化图,为节点添加阶段、原始ID、新增/退出标记"""
    G = nx.Graph()
    # 遍历每个阶段,添加节点及属性
    for layer, ids in enumerate(stages):
        for node_id in ids:
            # 用"阶段_原始ID"作为节点唯一标识,避免同ID跨阶段冲突
            unique_node = f"{layer}_{node_id}"
            # 判断是否为新增节点:第1阶段全部为新增,后续阶段不在上一阶段出现的ID
            is_new = layer == 0 or node_id not in stages[layer-1]
            # 判断是否为退出节点:非最后阶段中,不在下一阶段出现的ID
            is_exit = layer != len(stages)-1 and node_id not in stages[layer+1]
            
            G.add_node(
                unique_node,
                layer=layer,
                original_id=node_id,
                is_new=is_new,
                is_exit=is_exit
            )
    
    # 添加相邻阶段同ID节点的连接边,体现ID延续性
    for layer in range(len(stages)-1):
        current_ids = set(stages[layer])
        next_ids = set(stages[layer+1])
        # 只保留相邻阶段都存在的ID,创建对应节点的边
        common_ids = current_ids & next_ids
        for node_id in common_ids:
            G.add_edge(f"{layer}_{node_id}", f"{layer+1}_{node_id}")
    
    return G

# 创建时间演化图
G = build_temporal_graph(time_stages)

# 生成多层分区布局,按阶段排列节点
pos = nx.multipartite_layout(G, subset_key="layer")

# 分类筛选不同类型的节点
new_nodes = [n for n, d in G.nodes(data=True) if d['is_new']]
exit_nodes = [n for n, d in G.nodes(data=True) if d['is_exit']]
# 留存节点(非新增非退出)+最后阶段所有节点(全部设为空心)
remaining_nodes = [
    n for n, d in G.nodes(data=True) 
    if not d['is_new'] and not d['is_exit']
] + [n for n, d in G.nodes(data=True) if d['layer'] == len(time_stages)-1]

# 绘制可视化图表
plt.figure(figsize=(10, 6))

# 绘制留存/最后阶段节点(空心圆:白色填充+黑色边框)
nx.draw_networkx_nodes(
    G, pos, nodelist=remaining_nodes,
    node_color='white', edgecolors='black', node_size=800
)
# 绘制新增节点(绿色实心圆)
nx.draw_networkx_nodes(
    G, pos, nodelist=new_nodes,
    node_color='limegreen', node_size=800
)
# 绘制退出节点(红色实心圆)
nx.draw_networkx_nodes(
    G, pos, nodelist=exit_nodes,
    node_color='darkred', node_size=800
)

# 绘制节点间的连接边(灰色半透明,弱化视觉干扰)
nx.draw_networkx_edges(G, pos, edge_color='gray', alpha=0.6)

# 绘制节点标签(显示原始ID,清晰识别)
node_labels = {n: d['original_id'] for n, d in G.nodes(data=True)}
nx.draw_networkx_labels(G, pos, node_labels, font_size=12)

# 优化图表样式
plt.title("ID群体时间演化可视化", fontsize=14)
plt.axis('equal')
plt.box(False)
plt.show()

关键逻辑说明

  1. 节点唯一标识:用阶段编号_原始ID作为节点的唯一名称,避免不同阶段的相同ID被误判为同一个节点。
  2. 节点属性标记:
    • is_new:标记新增节点,第1阶段所有节点默认是新增,后续阶段中未在上一阶段出现的ID也标记为新增。
    • is_exit:标记退出节点,非最后阶段中,未出现在下一阶段的ID标记为退出。
  3. 边的创建:仅在相邻阶段的相同ID节点间创建边,直观体现ID的延续关系。
  4. 样式区分:
    • 新增节点:绿色实心圆
    • 退出节点:红色实心圆
    • 留存节点/最后阶段节点:白色填充+黑色边框的空心圆(最后阶段无后续,全部设为空心)

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:40:33