如何在NetworkX中仅绘制前50-100个连接的组件子图;一次绘制多个子图

时间:2019-07-02 02:05:00

标签: python networkx

抱歉,这很粗糙:这是我对Stackoverflow的第一篇文章!抱歉,我没有发布代码,但是我所做的事情并不复杂(也许就是问题所在),所以描述应该可以。如果由于我是Python的新手而无法描述问题,我也深表歉意。我不太确定如何在没有数据的情况下重新创建示例:(

使用NetworkX时,从熊猫中导入数据后,我经常运行带有数千个节点的大型无向图(我们称其为G)。 VAST大多数节点只有一个或两个边缘,这对我来说只是个噪音。它的群集中有许多令我感兴趣的节点,而实际上这只是少数。

然后,我将运行nx.connected_components命令以列出G包含的所有子图集的一长串,查看最上面的结果,并一次打印一个我感兴趣的子图。

这样,当我获得所有连接的组件子图的生成器列表/字典(通常很长)时,我通常也只会查看前50-100个结果。因为这些往往符合我的需求。

我尝试了nx.connected_component_subgraphs,但是有太多我不需要那种方法,几乎​​就像一次可视化整个网络一样糟糕。

简而言之:我该如何获取nx.connected_components给我的集合的生成器/列表(然后将其缩短到前50个),并将其生成新图表?

我尝试将nx.component_components的输出转换为列表,但这是所有集合。

没有错误消息。

1 个答案:

答案 0 :(得分:0)

一种方法可能类似于以下内容:

首先找到所有组件,但最大的 N

small_components = sorted(nx.connected_components(G), key=len)[:-N]

然后,从 G 中删除属于这些分量之一的所有顶点:

G.remove_nodes_from(itertools.chain.from_iterable(small_components))

在此示例中,我们仅保留给定图的两个最大成分:

In [31]: G = nx.Graph()
In [32]: G.add_edges_from([(1, 2), (2, 3), (3, 4), (5, 6), (7, 8), (8, 9)])
In [33]: small_components = sorted(nx.connected_components(G), key=len)[:-2]
In [34]: small_components
Out[34]: [{5, 6}]
In [35]: G.remove_nodes_from(itertools.chain.from_iterable(small_components))
In [36]: G.nodes()
Out[36]: NodeView((1, 2, 3, 4, 7, 8, 9))