如何使用 igraph 为 python 绘制基于社区的图表
How to plot Community-based graph using igraph for python
我有一个图表,我使用 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)
我得到以下结果:
我的问题是:
有没有办法使用特定的布局来绘制四个社区中的每一个,而不是这个混合图?我想将图中不同区域的每个社区分开,以增加其内部结构的可见性以及连接社区的具有较高中介中心性的少数边缘?
我使用了 contract-vertices
函数来帮助我进行可视化,但过于简单化了,它只是将每个社区都集中在一个点上,并且不允许可视化内部结构每个社区。我是否以最佳方式使用 'contract-vertices'?
谢谢。
我发现解决方案是大幅增加属于社区的边的权重(在下面的示例中是顶点数量的 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)
我假设社区内需要 'drastically increase' 边权重是因为我的图由一些顶点组成,这些顶点代表的顶点数量不到 2%,但有超过 80% 的顶点即使它们属于不同的社区,边缘也与它们相连。在下图中,许多
社区外的边缘为浅灰色:
我有一个图表,我使用 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)
我得到以下结果:
我的问题是:
有没有办法使用特定的布局来绘制四个社区中的每一个,而不是这个混合图?我想将图中不同区域的每个社区分开,以增加其内部结构的可见性以及连接社区的具有较高中介中心性的少数边缘?
我使用了
contract-vertices
函数来帮助我进行可视化,但过于简单化了,它只是将每个社区都集中在一个点上,并且不允许可视化内部结构每个社区。我是否以最佳方式使用 'contract-vertices'?
谢谢。
我发现解决方案是大幅增加属于社区的边的权重(在下面的示例中是顶点数量的 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)
我假设社区内需要 'drastically increase' 边权重是因为我的图由一些顶点组成,这些顶点代表的顶点数量不到 2%,但有超过 80% 的顶点即使它们属于不同的社区,边缘也与它们相连。在下图中,许多 社区外的边缘为浅灰色: