如何用Python的igraph可视化列表中的社区(含代码修改需求)
社区可视化实现方案
基于igraph的修改方案
先修复原代码中的变量错误(原代码误用g而非g_test),再通过节点颜色区分+社区轮廓标记实现社区可视化。注意G出现在两个社区中,以下代码默认保留其首次出现的社区归属,你可按需调整:
from igraph import * list_community = [['A', 'B', 'C', 'D'],['E','F','G'],['G', 'H','I','J']] list_nodes = ['A', 'B', 'C', 'D','E','F','G','H','I','J'] tuple_edges = [('A','B'),('A','C'),('A','D'),('B','C'),('B','D'), ('C','D'),('C','E'), ('E','F'),('E','G'),('F','G'),('G','H'), ('G','I'), ('G','J'),('H','I'),('H','J'),('I','J'),] # 创建图 g_test = Graph() g_test.add_vertices(list_nodes) g_test.add_edges(tuple_edges) g_test.vs["name"] = list_nodes # 修正变量名错误 # 1. 建立节点到社区的映射(处理重复节点G,保留首次出现的归属) community_map = {} for idx, comm in enumerate(list_community): for node in comm: if node not in community_map: community_map[node] = idx # 可选:手动调整G的社区归属 # community_map['G'] = 2 # 2. 为节点分配对应社区的颜色 color_palette = ['#FF6B6B', '#4ECDC4', '#45B7D1'] g_test.vs['color'] = [color_palette[community_map[node]] for node in g_test.vs['name']] # 3. 配置可视化样式,添加社区轮廓标记 layout = g_test.layout("kk") visual_style = { "vertex_label": g_test.vs["name"], "layout": layout, "vertex_size": 30, "edge_width": 1, # 标记社区边界,用对应颜色的半透明轮廓 "mark_groups": [ [g_test.vs.find(name=node).index for node in comm] for comm in list_community ], "mark_color": [rgba(*Color(c).rgb, alpha=0.2) for c in color_palette], "mark_border_width": 2 } # 绘图 plot(g_test, **visual_style)
关键修改说明
- 修正原代码中
g.vs的变量名错误,统一使用g_test - 建立节点与社区的映射关系,处理重复节点的归属问题
- 用不同颜色区分不同社区的节点
- 通过
mark_groups参数为每个社区添加半透明轮廓,强化社区边界
基于NetworkX+Matplotlib的替代方案
如果你更熟悉NetworkX生态,可使用以下代码实现:
import networkx as nx import matplotlib.pyplot as plt from matplotlib.patches import Polygon from scipy.spatial import ConvexHull import numpy as np list_community = [['A', 'B', 'C', 'D'],['E','F','G'],['G', 'H','I','J']] list_nodes = ['A', 'B', 'C', 'D','E','F','G','H','I','J'] tuple_edges = [('A','B'),('A','C'),('A','D'),('B','C'),('B','D'), ('C','D'),('C','E'), ('E','F'),('E','G'),('F','G'),('G','H'), ('G','I'), ('G','J'),('H','I'),('H','J'),('I','J'),] # 创建图 G = nx.Graph() G.add_nodes_from(list_nodes) G.add_edges_from(tuple_edges) # 节点-社区映射(处理G的重复归属) community_map = {} for idx, comm in enumerate(list_community): for node in comm: if node not in community_map: community_map[node] = idx # 可选:调整G的社区归属 # community_map['G'] = 2 # 颜色分配 color_palette = ['#FF6B6B', '#4ECDC4', '#45B7D1'] node_colors = [color_palette[community_map[node]] for node in G.nodes()] # 绘图 plt.figure(figsize=(10,8)) layout = nx.spring_layout(G, seed=42) # 固定种子保证布局可重复 # 绘制节点、边和标签 nx.draw_networkx_nodes(G, layout, node_size=800, node_color=node_colors, edgecolors='black') nx.draw_networkx_edges(G, layout, width=1, alpha=0.7) nx.draw_networkx_labels(G, layout, font_size=12, font_weight='bold') # 绘制社区凸包轮廓 for idx, comm in enumerate(list_community): comm_nodes = [layout[node] for node in comm] if len(comm_nodes) >= 3: hull = ConvexHull(np.array(comm_nodes)) polygon = Polygon(np.array(comm_nodes)[hull.vertices], color=color_palette[idx], alpha=0.2) plt.gca().add_patch(polygon) plt.axis('off') plt.show()
注意事项
- 对于重复节点(如
G),需明确其归属社区,上述代码默认保留首次出现的社区,可手动修改community_map调整 - 两种方案均通过颜色区分节点、轮廓标记社区,实现类似示例图的可视化效果
内容的提问来源于stack exchange,提问作者mimi
相关产品推荐
相关产品推荐

