如何在NetworkX中基于指定节点路径绘制图的特定边?
问题描述
我有一个全连接的有向图,默认绘制会显示所有节点和边,但现在需要仅绘制指定节点路径对应的边。
指定的节点路径数组如下:
[ ['A', 'C', 'B', 'A'], ['A', 'E', 'D', 'F', 'A'], ['A', 'H', 'G', 'I', 'A'] ]
我的现有代码:
G = nx.DiGraph(edge_list) nx.draw( G, with_labels=True, node_color=['aqua'] + ['pink'] * (len(G.nodes) - 1) )
完整的全连接边列表edge_list:
edge_list = [ ('A', 'B'), ('A', 'C'), ('A', 'D'), ('A', 'E'), ('A', 'F'), ('A', 'G'), ('A', 'H'), ('A', 'I'), ('A', 'J'), ('B', 'A'), ('B', 'C'), ('B', 'D'), ('B', 'E'), ('B', 'F'), ('B', 'G'), ('B', 'H'), ('B', 'I'), ('B', 'J'), ('C', 'A'), ('C', 'B'), ('C', 'D'), ('C', 'E'), ('C', 'F'), ('C', 'G'), ('C', 'H'), ('C', 'I'), ('C', 'J'), ('D', 'A'), ('D', 'B'), ('D', 'C'), ('D', 'E'), ('D', 'F'), ('D', 'G'), ('D', 'H'), ('D', 'I'), ('D', 'J'), ('E', 'A'), ('E', 'B'), ('E', 'C'), ('E', 'D'), ('E', 'F'), ('E', 'G'), ('E', 'H'), ('E', 'I'), ('E', 'J'), ('F', 'A'), ('F', 'B'), ('F', 'C'), ('F', 'D'), ('F', 'E'), ('F', 'G'), ('F', 'H'), ('F', 'I'), ('F', 'J'), ('G', 'A'), ('G', 'B'), ('G', 'C'), ('G', 'D'), ('G', 'E'), ('G', 'F'), ('G', 'H'), ('G', 'I'), ('G', 'J'), ('H', 'A'), ('H', 'B'), ('H', 'C'), ('H', 'D'), ('H', 'E'), ('H', 'F'), ('H', 'G'), ('H', 'I'), ('H', 'J'), ('I', 'A'), ('I', 'B'), ('I', 'C'), ('I', 'D'), ('I', 'E'), ('I', 'F'), ('I', 'G'), ('I', 'H'), ('I', 'J'), ('J', 'A'), ('J', 'B'), ('J', 'C'), ('J', 'D'), ('J', 'E'), ('J', 'F'), ('J', 'G'), ('J', 'H'), ('J', 'I') ]
解决方案
要实现仅绘制指定路径对应的边,分两步操作:
1. 从路径数组提取目标边集合
遍历每个路径,将连续节点对转换为边(比如路径['A','C','B','A']对应边('A','C'), ('C','B'), ('B','A')),代码如下:
paths = [ ['A', 'C', 'B', 'A'], ['A', 'E', 'D', 'F', 'A'], ['A', 'H', 'G', 'I', 'A'] ] # 提取所有目标边 target_edges = [] for path in paths: for i in range(len(path)-1): target_edges.append( (path[i], path[i+1]) ) # 去重(避免路径重复导致边重复) target_edges = list(set(target_edges))
2. 绘制指定边
提供两种实用方式,根据场景选择:
方式一:创建仅含目标边的子图
直接从原图生成只包含目标边的子图,适合只展示目标路径的场景:
import networkx as nx import matplotlib.pyplot as plt # 初始化原图 G = nx.DiGraph(edge_list) # 生成仅包含目标边的子图 subG = G.edge_subgraph(target_edges) # 设置节点颜色(保持原逻辑) node_colors = ['aqua' if node == 'A' else 'pink' for node in subG.nodes] # 绘制子图 nx.draw(subG, with_labels=True, node_color=node_colors) plt.show()
方式二:保留所有节点仅绘制目标边
如果需要保持原图所有节点的位置和显示,仅隐藏非目标边,适合对比场景:
import networkx as nx import matplotlib.pyplot as plt G = nx.DiGraph(edge_list) # 获取原图节点布局(确保位置与原图一致) pos = nx.spring_layout(G) # 绘制所有节点(保留原颜色) nx.draw_networkx_nodes(G, pos, node_color=['aqua'] + ['pink']*(len(G.nodes)-1)) # 绘制节点标签 nx.draw_networkx_labels(G, pos) # 仅绘制目标边 nx.draw_networkx_edges(G, pos, edgelist=target_edges, arrowstyle='->') plt.show()
内容的提问来源于stack exchange,提问作者Alireza A2F
相关产品推荐
相关产品推荐

