使用NetworkX将簇中的顶点分组

时间:2013-07-07 11:58:25

标签: python matplotlib networkx

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

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

我想在每个群集周围绘制一些分隔线。我目前的代码是这样的:

    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对图表进行聚类。

1 个答案:

答案 0 :(得分:3)

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

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

因此,您所询问的这个数字有4个不同的社区,这些社区基于每个社区内有很多边缘而在外面并不多。

如果您不想付出太多努力,spring_layout通常适合将紧密结合的社区组合在一起。 spring_layout的基本算法就像边缘是弹簧(和节点排斥)一样。因此,许多边缘使节点靠近在一起。请注意,它会随机初始化位置,因此每次您获得不同的输出。

最简单的方法就是

nx.draw_spring(G)

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

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

其中xcoord和ycoord是您希望节点所在的坐标。

然后就这样做     draw_networkx(G,pos = pos)

这通常需要付出很多努力。所以有时你只是说它们中的一些必须在特定的地方,并让networkx做其余的事情

为几个节点定义fixedpos然后运行     spring_layout 告诉它什么节点是固定的,并给它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进行绘制。

相关问题