You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:35:35