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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:15:35