使用NetworkX对簇中的顶点进行分组

2024-05-13 18:45:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图以图形的方式表示一些图,我需要在集群中分组一些具有共同特征的节点。

我正在使用NetworkX,我需要对幻灯片44的左图this tutorial中的图形执行类似的操作。

我想在每个集群周围画一条分界线。我现在的代码是这样的:

    vec = self.colors
    colors = (linspace(0,1, len (set (vec)))* 20 + 10)
    nx.draw_circular(g, node_color=array([colors[x] for x in vec]))
    show ()

我想找一个例子,看看如何使用networkx对图形进行集群。


Tags: 代码selfnetworkx图形节点方式集群特征
1条回答
网友
1楼 · 发布于 2024-05-13 18:45:21

我不确定你的问题是什么。我想你是在问“如何让networkx把一些节点放在一起”

在开始回答之前,networkx的绘图文档在这里:http://networkx.lanl.gov/reference/drawing.html

所以你要问的这个数字有4个不同的社区,它们是基于每个社区内有很多边而外部没有很多边而聚集在一起的。

如果您不想投入太多精力,spring_布局通常有助于将紧密联系的社区组织在一起。spring_布局的基本算法就好像边是弹簧一样(节点相互排斥)。所以很多边使得节点紧密地连接在一起。注意,它会随机初始化位置,所以每次都会得到不同的输出。

最简单的方法就是

nx.draw_spring(G)

但也许你想要更多。如果愿意,可以修复每个节点的位置。定义一个dict,通常命名为pos

pos = {}
for node in G.nodes_iter():
    pos[node] = (xcoord, ycoord).

其中xcoord和ycoord是您希望节点位于的坐标。

那就做吧 绘制网络x(G,pos=pos)

这通常是很大的努力。所以有时候你只需要告诉它其中的一些必须在特定的地方,然后让networkx做剩下的

为几个节点定义fixedpos,然后运行 弹簧布置 告诉它哪些节点是固定的,并将fixedpos作为初始位置。然后它会把这些固定住,把周围的一切都装进去。

下面是一些代码,它生成了一个网络,其中有4个完全连接的部分和它们之间的一些其他边。(实际上,它生成一个完整的网络,然后删除这些部分之间的所有边(除了一些边)。然后它用一个简单的弹簧布局绘制它。然后它将其中的4个节点固定在一个正方形的角上,并将其他节点放置在这些固定位置的周围。

import networkx as nx
import random
import pylab as py
from math import floor

G = nx.complete_graph(20)

for edge in G.edges():
    if floor(edge[0]/5.)!=floor(edge[1]/5.):
        if random.random()<0.95:
            G.remove_edge(edge[0],edge[1])


nx.draw_spring(G)
py.show()


fixedpos = {1:(0,0), 6:(1,1), 11:(1,0), 16:(0,1)}
pos = nx.spring_layout(G, fixed = fixedpos.keys(), pos = fixedpos)

nx.draw_networkx(G, pos=pos)

py.show()

您还可以指定边的权重,将权重传递给spring_layout,较大的权重将告诉它使相应的节点更靠近。因此,一旦您确定了您的社区,如果需要,请在社区/集群中增加权重,以使它们保持紧密联系。

请注意,您还可以指定创建每个节点的颜色,因此可以直接为每个社区/集群指定颜色。

如果要围绕每个簇绘制曲线,则必须通过matplotlib完成。

相关问题 更多 >