Networkx: постройте подграф, подобный подкомпоненту в igraph R

Я пытаюсь построить график networkx на Python. Вместо того, чтобы строить все узлы и ребра, я бы хотел отфильтровать узлы, которые имеют ссылку на заданный пользователем узел. Я думаю, что это похоже на подкомпонент в iGraph в R. Например, в приведенном ниже коде мой фрейм данных имеет узел 4429. Я хотел бы построить узлы и ребра, которые прямо или косвенно связаны с 4429.

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import pylab

G = nx.DiGraph()

g = nx.from_pandas_edgelist(dataframe, 'Source', 'Target', ['Freq'])
nx.draw_networkx(g)
plt.xticks([], [])
plt.yticks([], [])
fig = plt.gcf()
fig.set_size_inches(15, 15)

plt.show() 

Любая помощь будет оценена. Благодарю.

3 ответа

Решение

Это то, что вы ищете?

Редактировать: не уверен, почему это недооценено, но я думаю, что это буквально ответ. Вот пример:

import networkx as nx
from matplotlib.pyplot import subplots
G = nx.path_graph(4)
G.add_edge(5,6)

fig, ax = subplots(2)
for axi, sub in zip(ax, nx.connected_component_subgraphs(G)):
    nx.draw(sub, ax = axi)

введите описание изображения здесь

изменить 2: только для подсети, подключенной к узлу, используйте это:

import networkx as nx
from matplotlib.pyplot import subplots
G = nx.path_graph(4)
G.add_edge(5,6)

fig, ax = subplots()
subnet = nx.node_connected_component(G, 0)
nx.draw(G.subgraph(subnet), ax = ax, with_labels = True)
fig.show()

введите описание изображения здесь

Среди всех подключенных компонентов найдите тот, который содержит рассматриваемый узел, и постройте его.

subs = nx.connected_component_subgraphs(G)
seed = 4429
g = [sg for sg in subs if seed in sg][0]
nx.draw_networkx(g)

Быстрое решение может быть фильтрация кадра данных:

g = nx.from_pandas_edgelist(dataframe.loc[(dataframe["Source"] == id) | (dataframe["Target"] == id)])

Если вы знаете максимальную степень, которую вы можете использовать single_source_dijkstra_path_length

nx.single_source_dijkstra_path_length(G=graph,
                                      Source=id,
                                      cutoff=cutoff)
Другие вопросы по тегам