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)