绘制同一社区或分区的网络和分组顶点 [英] Draw network and grouped vertices of the same community or partition

查看:71
本文介绍了绘制同一社区或分区的网络和分组顶点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我有以下内容:

 从随机导入randint 

def _plot(g,Membership = None)导入图形

layout = g.layout( kk )
visual_style = {}
visual_style [ edge_color] =灰色
visual_style [ vertex_size] = 30
visual_style [ layout] =布局
visual_style [ bbox] =(1024,768)
visual_style [ margin] = 40
对于g.vs()中的顶点:$ b​​ $ b vertex [ label] =顶点.index
如果没有隶属关系,则无:
colors = []
for i in range(0,max(membership)+1):
colors.append('%06X '%randint(0,0xFFFFFF))
用于g.vs()中的顶点:$ b​​ $ b vertex [ color] = str('#')+ colors [membership [vertex.index]]
visual_style [ vertex_color] = g.vs [ color]
igraph.plot(g,** visual_style)

如果__name__ == __main__:
空手道= igraph.Nexus.get(空手道)
cl = karate.community_fastgreedy()
成员资格= cl.as_clustering()。成员资格
_plot(空手道,成员资格)

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





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



例如:



解决方案

基于@ gabor-csardi答案,我编写了以下代码:

 从随机导入randint 

def _plot(g,Membership = None):
中导入图形i

gcopy = g.copy()
edges = []
edges_colors = []
for g.es()中的edge:
如果membership [edge.tuple [0]]!=成员资格[edge.tuple [1]]:
edge.append(edge)
edge_colors.append( gray)
其他:
edge_colors.append( black)
gcopy.delete_edges(edges)
layout = gcopy.layout( kk)
g.es [ color] = edge_colors
其他:
layout = g.layout( kk)
g。 es [ color] =灰色
visual_style = {}
visual_style [ vertex_label_dist] = 0
visual_style [ vertex_shape] =圆圈
visual_style [ edge_color] = g.es [ color]
#visual_style [ bbox] =(4000,2500)
visual_style [ vertex_size] = 30
visual_style [ layout ] =布局
visual_style [ bbox] =(1024,768)
visual_style [ margin] = 40
visual_style [ edge_label] = g.es [ weight ]
用于g.vs()中的顶点:$ b​​ $ b vertex [ label] = vertex.index
(如果不是隶属关系则无):
颜色= []
对于范围(0,max(成员身份)+1)中的i:
colors.append('%06X'%randint(0,0xFFFFFF))
用于g.vs()中的顶点:
vertex [ color] = str('#')+ colors [membership [vertex.index]]
visual_style [ vertex_co lor] = g.vs [ color]
igraph.plot(g,** visual_style)

如果__name__ == __main__:
g = igraph.Nexus .get(空手道)
cl = g.community_fastgreedy()
成员资格= cl.as_clustering()。membership
_plot(g,成员资格)

结果:




I need view (drawn or plot) the communities structure in networks

I have this:

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)

But the vertices are spread. In another networks this result is very worse.

I want the vertices are grouped by color in a similar region.

E.g:

解决方案

Based on @gabor-csardi answer, I made this code:

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)

Results:

这篇关于绘制同一社区或分区的网络和分组顶点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆