如何删除断开连接的网络中的特定组件
How to remove specific components in a disconnected network
假设我们有以下数据(我的整个数据集的一个样本,有数千行):
Node Target
1 2
1 3
1 5
2 1
2 3
2 6
7 8
7 12
9 13
9 15
9 14
显然,如果我在图表中绘制此数据,我有两个断开连接的组件。
我想知道如何从我的网络中隔离或删除一个组件,例如最小的一个。
我会说首先我应该确定组件,然后 isolate/filtering 找出我不感兴趣的组件。
G = nx.from_pandas_edgelist(df, 'Node', 'Target')
connected_com=[len(c) for c in sorted(nx.connected_components(G), key=len, reverse=True)]
现在我应该只使用来自最大组件的数据创建一个网络:
largest_cc = max(nx.connected_components(G), key=len)
如果有两个组件,这很容易。但是,如果我想 select 两个组件并排除一个,我应该怎么办?这是我的问题。
在您提供的示例数据中,使用以下代码绘制图表时获得了 3 个岛屿:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import networkx as nx
df=pd.read_fwf('data.txt')
G = nx.from_pandas_edgelist(df, 'Node', 'Target')
nx.draw(G,with_labels=True)
图表看起来像这样:
现在如果你只想保留最大的两个岛,你可以使用你提到的 nx.connected_components(G)
函数并存储两个最大的组件。下面是执行此操作的代码:
N_subs=2 #Number of biggest islands you want to keep
G_sub=[]
largest_components=[]
for i in range(N_subs):
largest_components.append(sorted(nx.connected_components(G), key=len, reverse=True)[i])
G_sub.append(G.subgraph(largest_components[i]))
然后您需要创建一个由两个岛组成的 G 子图。您可以使用 nx.compose_all
来做到这一点。然后你可以绘制你的子图
G_subgraphs=nx.compose_all(G_sub)
nx.draw(G_subgraphs,with_labels=True)
总的来说,代码如下所示:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import networkx as nx
df=pd.read_fwf('data.txt')
G = nx.from_pandas_edgelist(df, 'Node', 'Target')
N_subs=2
G_sub=[]
largest_components=[]
for i in range(N_subs):
largest_components.append(sorted(nx.connected_components(G), key=len, reverse=True)[i])
G_sub.append(G.subgraph(largest_components[i]))
G_subgraphs=nx.compose_all(G_sub)
nx.draw(G_subgraphs,with_labels=True)
此代码的输出为:
注:根据this,nx.connected_components
最好用于无向图。由于您正在处理有向图,因此您可能希望改用 strongly_connected_components(G)
或 weakly_connected_components(G)
。
假设我们有以下数据(我的整个数据集的一个样本,有数千行):
Node Target
1 2
1 3
1 5
2 1
2 3
2 6
7 8
7 12
9 13
9 15
9 14
显然,如果我在图表中绘制此数据,我有两个断开连接的组件。 我想知道如何从我的网络中隔离或删除一个组件,例如最小的一个。 我会说首先我应该确定组件,然后 isolate/filtering 找出我不感兴趣的组件。
G = nx.from_pandas_edgelist(df, 'Node', 'Target')
connected_com=[len(c) for c in sorted(nx.connected_components(G), key=len, reverse=True)]
现在我应该只使用来自最大组件的数据创建一个网络:
largest_cc = max(nx.connected_components(G), key=len)
如果有两个组件,这很容易。但是,如果我想 select 两个组件并排除一个,我应该怎么办?这是我的问题。
在您提供的示例数据中,使用以下代码绘制图表时获得了 3 个岛屿:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import networkx as nx
df=pd.read_fwf('data.txt')
G = nx.from_pandas_edgelist(df, 'Node', 'Target')
nx.draw(G,with_labels=True)
图表看起来像这样:
现在如果你只想保留最大的两个岛,你可以使用你提到的 nx.connected_components(G)
函数并存储两个最大的组件。下面是执行此操作的代码:
N_subs=2 #Number of biggest islands you want to keep
G_sub=[]
largest_components=[]
for i in range(N_subs):
largest_components.append(sorted(nx.connected_components(G), key=len, reverse=True)[i])
G_sub.append(G.subgraph(largest_components[i]))
然后您需要创建一个由两个岛组成的 G 子图。您可以使用 nx.compose_all
来做到这一点。然后你可以绘制你的子图
G_subgraphs=nx.compose_all(G_sub)
nx.draw(G_subgraphs,with_labels=True)
总的来说,代码如下所示:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import networkx as nx
df=pd.read_fwf('data.txt')
G = nx.from_pandas_edgelist(df, 'Node', 'Target')
N_subs=2
G_sub=[]
largest_components=[]
for i in range(N_subs):
largest_components.append(sorted(nx.connected_components(G), key=len, reverse=True)[i])
G_sub.append(G.subgraph(largest_components[i]))
G_subgraphs=nx.compose_all(G_sub)
nx.draw(G_subgraphs,with_labels=True)
此代码的输出为:
注:根据this,nx.connected_components
最好用于无向图。由于您正在处理有向图,因此您可能希望改用 strongly_connected_components(G)
或 weakly_connected_components(G)
。