如何用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()
关键逻辑说明
- 节点唯一标识:用
阶段编号_原始ID作为节点的唯一名称,避免不同阶段的相同ID被误判为同一个节点。 - 节点属性标记:
is_new:标记新增节点,第1阶段所有节点默认是新增,后续阶段中未在上一阶段出现的ID也标记为新增。is_exit:标记退出节点,非最后阶段中,未出现在下一阶段的ID标记为退出。
- 边的创建:仅在相邻阶段的相同ID节点间创建边,直观体现ID的延续关系。
- 样式区分:
- 新增节点:绿色实心圆
- 退出节点:红色实心圆
- 留存节点/最后阶段节点:白色填充+黑色边框的空心圆(最后阶段无后续,全部设为空心)
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

