【问题标题】:Draw network and grouped vertices of the same community or partition绘制同一社区或分区的网络和分组顶点
【发布时间】:2014-04-20 15:38:57
【问题描述】:

我需要查看(绘制或绘制)网络中的社区结构

我有这个:

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)

但是顶点是分散的。在另一个网络中,这个结果非常糟糕。

我希望顶点在相似区域中按颜色分组。

例如:

【问题讨论】:

    标签: python social-networking cluster-analysis igraph


    【解决方案1】:

    根据@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)
    

    结果:

    【讨论】:

      【解决方案2】:

      移除跨多个社区的边,计算没有这些边的布局,然后将其用于原始图。

      【讨论】:

        【解决方案3】:

        要将社区的顶点组合在一起并突出显示它们,您应该使用“mark_groups=True”。见http://igraph.org/python/doc/igraph.clustering-pysrc.html#VertexClustering.plot

        【讨论】:

          猜你喜欢
          • 2014-08-17
          • 2015-04-25
          • 2021-08-01
          • 2013-02-11
          • 1970-01-01
          • 1970-01-01
          • 2015-01-10
          • 2020-01-27
          • 1970-01-01
          相关资源
          最近更新 更多