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

标签 python social-networking cluster-analysis igraph

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

我有这个:

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)

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

enter image description here

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

例如:

enter image description here

最佳答案

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

结果:

enter image description here

关于python - 绘制同一社区或分区的网络和分组顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23184306/

相关文章:

python - 系统崩溃后如何修复 conda?

ajax - 看似 'live'数据驱动的网站使用了哪些技术?

objective-c - 如何通过Email Id获取社交网络资料信息?

python - 如何将分离的部分(来自 k-means 聚类)保存为不同的数据帧

Python将Excel拆分为标题和值

python - 在 Python 3 中已存在 NLTK 时在 Python 2.7 中安装它

javascript - 如何实现像按钮这样的社交网络的完全改变设计

python - 使用 networkx 提取所有 k-cores

cluster-analysis - k-means 集群中可以有重叠吗?

python - 将 IPv4 和 IPv6 源地址绑定(bind)到 python 套接字