9

我试图以图形方式表示一些图形,并且我需要将一些具有共同特征的节点分组。

我正在使用 NetworkX,我需要对本教程中的图表(幻灯片 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 对图形进行聚类。

4

1 回答 1

6

我不确定你的问题是什么。我想你是在问“我如何让 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 做剩下的

为几个节点定义固定位置,然后运行 ​​spring_layout 告诉它哪些节点是固定的,并将固定位置作为初始位置。然后它将保持那些固定并适合周围的所有东西。

下面是一些代码,它生成了一个具有 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 来做到这一点。

于 2014-12-11T05:26:57.950 回答