【问题标题】:Group vertices in clusters using NetworkX使用 NetworkX 对集群中的顶点进行分组
【发布时间】:2013-07-04 22:02:28
【问题描述】:

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

我正在使用 NetworkX,我需要对来自 this tutorial 的图表(来自幻灯片 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 对图进行聚类。

【问题讨论】:

    标签: python matplotlib networkx


    【解决方案1】:

    我不确定你的问题是什么。我想你是在问“我如何让 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 告诉它哪些节点是固定的,并将其固定位置作为初始位置。然后它将保持那些固定并适合周围的所有东西。

    这里有一些代码可以生成一个网络,该网络有 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 来做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 2017-03-29
      • 2021-09-14
      • 2012-02-06
      • 2016-07-12
      • 1970-01-01
      相关资源
      最近更新 更多