如何使用igraph for python绘制基于社区的图形

时间:2016-11-05 20:46:05

标签: python graph igraph

我有一个图表,我使用Louvain-Algorithm实现从中提取社区:

clusters = g.community_multilevel( weights=None, return_levels=False)

然后我为每个社区应用不同的着色:

new_cmap = ['#'+''.join([random.choice('0123456789abcdef') for x in range(6)]) for z in range(len(clusters))]
colors = {v: new_cmap[i] for i, c in enumerate(clusters) for v in c}
g.vs["color"] = [colors[e] for e in g.vs.indices]

最后我绘制了图表:

visual_style["layout"] = g.layout_fruchterman_reingold(weights=g.es["weight"], maxiter=1000, area=N ** 3, repulserad=N ** 3)
igraph.plot(g, **visual_style)

我得到了以下结果: enter image description here

  • 我的问题是:

    1. 有没有一种方法可以使用特定的布局,而不是这种混合图形来绘制自己分组的四个社区中的每一个?我想将图表的不同区域中的每个社区分开,增加其内部结构的可见性以及连接社区的中间性更高的少数边缘?

    2. 我使用了帮助我进行可视化的contract-vertices函数,但过于简单化只是将每个社区分组在一个点上并且不允许可视化每个社区的内部结构。我使用'合约顶点'以最好的方式?

感谢。

1 个答案:

答案 0 :(得分:2)

我发现解决方案是大幅增加属于社区的边缘权重(以下示例中顶点数量的3倍):

clusters = g.community_multilevel( weights=None, return_levels=False)
member = clusters.membership
new_cmap = ['#'+''.join([random.choice('0123456789abcdef') for x in range(6)]) for z in range(len(clusters))]

vcolors = {v: new_cmap[i] for i, c in enumerate(clusters) for v in c}
g.vs["color"] = [vcolors[v] for v in g.vs.indices]

ecolors = {e.index: new_cmap[member[e.tuple[0]]] if member[e.tuple[0]]==member[e.tuple[1]] else "#e0e0e0" for e in g.es}
eweights = {e.index: (3*g.vcount()) if member[e.tuple[0]]==member[e.tuple[1]] else 0.1 for e in g.es}
g.es["weight"] = [eweights[e.index] for e in g.es]
g.es["color"] = [ecolors[e] for e in g.es.indices]

visual_style["layout"] = g.layout_fruchterman_reingold(weights=g.es["weight"], maxiter=500, area=N ** 3, repulserad=N ** 3)
igraph.plot(g, **visual_style)

我认为需要大幅增加'社区内的边缘权重是由于我的图形由一些顶点组成,这些顶点表示顶点数量少于2%但是有超过80%的边连接到它们,即使它们属于不同的社区。在下图中有很多 社区外的边缘是浅灰色的:

enter image description here