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



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

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

因此,我将运行nx.connected_components命令,列出 G 中包含的所有子图集,查看排名靠前的结果,并一次打印一个我感兴趣的各个子图。

因此,当我得到所有连接的组件子图的生成器列表/字典(通常很长)时,我通常也会只查看前 50-100 个结果。 因为这些往往有我想要的东西。

我尝试了nx.connected_component_subgraphs,但是,有很多我不需要这种方式,它几乎和一次可视化整个网络一样糟糕。

简而言之:我怎样才能把nx.connected_components给我的生成器/集合列表——然后我将其缩短到前 50 名——并把它变成一个新的图表?

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

无错误消息。

一种方法可能如下所示:

首先找到除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))

最新更新