绘制同一社区或分区的网络和分组顶点

3 投票
3 回答
4345 浏览
提问于 2025-04-18 03:30

我需要在网络中展示(绘制或图示)社区结构。

我现在有这个:

import igraph
from random import randint

def _plot(g, membership=None):
    layout = g.layout("kk")
    visual_style = {}
    visual_style["edge_color"] = "gray"
    visual_style["vertex_size"] = 30
    visual_style["layout"] = layout
    visual_style["bbox"] = (1024, 768)
    visual_style["margin"] = 40
    for vertex in g.vs():
        vertex["label"] = vertex.index
    if membership is not None:
        colors = []
        for i in range(0, max(membership)+1):
            colors.append('%06X' % randint(0, 0xFFFFFF))
        for vertex in g.vs():
            vertex["color"] = str('#') + colors[membership[vertex.index]]
        visual_style["vertex_color"] = g.vs["color"]
    igraph.plot(g, **visual_style)

if __name__ == "__main__":
    karate = igraph.Nexus.get("karate")
    cl = karate.community_fastgreedy()
    membership = cl.as_clustering().membership
    _plot(karate, membership)

但是这些点(节点)分散得很。在其他网络中,这个结果更糟糕。

这里输入图片描述

我希望这些点(节点)能够按颜色分组,聚集在相似的区域。

比如:

这里输入图片描述

3 个回答

1

要把一个社区的节点聚在一起并突出显示,你应该使用 'mark_groups=True' 这个选项。详细信息可以查看这个链接:http://igraph.org/python/doc/igraph.clustering-pysrc.html#VertexClustering.plot

1

去掉多个社区之间的连接边,计算没有这些边的布局,然后再把这个布局应用到原始图上。

4

根据@gabor-csardi的回答,我写了这段代码:

import igraph
from random import randint

def _plot(g, membership=None):
    if membership is not None:
        gcopy = g.copy()
        edges = []
        edges_colors = []
        for edge in g.es():
            if membership[edge.tuple[0]] != membership[edge.tuple[1]]:
                edges.append(edge)
                edges_colors.append("gray")
            else:
                edges_colors.append("black")
        gcopy.delete_edges(edges)
        layout = gcopy.layout("kk")
        g.es["color"] = edges_colors
    else:
        layout = g.layout("kk")
        g.es["color"] = "gray"
    visual_style = {}
    visual_style["vertex_label_dist"] = 0
    visual_style["vertex_shape"] = "circle"
    visual_style["edge_color"] = g.es["color"]
    # visual_style["bbox"] = (4000, 2500)
    visual_style["vertex_size"] = 30
    visual_style["layout"] = layout
    visual_style["bbox"] = (1024, 768)
    visual_style["margin"] = 40
    visual_style["edge_label"] = g.es["weight"]
    for vertex in g.vs():
        vertex["label"] = vertex.index
    if membership is not None:
        colors = []
        for i in range(0, max(membership)+1):
            colors.append('%06X' % randint(0, 0xFFFFFF))
        for vertex in g.vs():
            vertex["color"] = str('#') + colors[membership[vertex.index]]
        visual_style["vertex_color"] = g.vs["color"]
    igraph.plot(g, **visual_style)

if __name__ == "__main__":
    g = igraph.Nexus.get("karate")
    cl = g.community_fastgreedy()
    membership = cl.as_clustering().membership
    _plot(g, membership)

结果:

在这里输入图片描述

撰写回答