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

如何基于指定节点列表绘制NetworkX有向图的子集?

如何从NetworkX有向图中提取指定节点的子图?

当然可以!你完全不需要重新构造DataFrame来实现这个需求,NetworkX本身就提供了简洁的方法,两种思路都能轻松达成你的目标:

方法一:直接从已有图中提取指定节点的子图

这是最便捷的方式——利用NetworkX的subgraph()方法,直接传入你想要保留的节点列表,它会自动保留这些节点以及它们之间原本存在的所有边:

import networkx as nx
from matplotlib import pyplot as plt
%matplotlib notebook
import pandas as pd

# 你的原始数据和完整图构建
data={"A":["T1","T2","tom","adi","matan","tali","pimpunzu","jack","arzu"], "B":["end","end","T1","T1","T1","T2","T2","matan","matan"]}
df=pd.DataFrame.from_dict(data)
G = nx.from_pandas_edgelist(df,source='A',target='B', edge_attr=None, create_using=nx.DiGraph())

# 指定要保留的节点列表
target_nodes = ["T1","matan","jack","arzu"]
# 提取子图
subG = G.subgraph(target_nodes)

# 绘制子图
f, ax = plt.subplots(figsize=(10, 10))
nx.draw(subG, with_labels=True, font_weight='bold', ax=ax)

这个方法会精准保留你指定的节点,以及这些节点之间存在的所有有向边,完全匹配你手动构造子集的预期效果。

方法二:从源数据筛选节点间的边后构建子图

如果你需要更精细地控制边的筛选(比如只保留特定方向或满足其他条件的边),可以先在DataFrame层面筛选出两端都属于目标节点的边,再构建子图:

import networkx as nx
from matplotlib import pyplot as plt
%matplotlib notebook
import pandas as pd

# 你的原始数据
data={"A":["T1","T2","tom","adi","matan","tali","pimpunzu","jack","arzu"], "B":["end","end","T1","T1","T1","T2","T2","matan","matan"]}
df=pd.DataFrame.from_dict(data)

target_nodes = ["T1","matan","jack","arzu"]
# 筛选出源节点和目标节点都在指定列表中的边
filtered_df = df[(df['A'].isin(target_nodes)) & (df['B'].isin(target_nodes))]

# 基于筛选后的边构建子图
subG = nx.from_pandas_edgelist(filtered_df, source='A', target='B', create_using=nx.DiGraph())

# 绘制子图
f, ax = plt.subplots(figsize=(10, 10))
nx.draw(subG, with_labels=True, font_weight='bold', ax=ax)

两种方法对比

  • 方法一更高效简洁,适合你已经构建好完整图的场景,直接提取即可;
  • 方法二更灵活,适合需要对边做额外过滤的场景(比如只保留某些类型的边)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:07:36