如何基于指定规则矩阵利用igraph构建有向网络?
用igraph实现带单向/双向关系的网络
1. 准备数据
先把题目中的邻接矩阵和节点名称对应好,用Python列表定义:
import igraph as ig # 邻接矩阵:行/列依次对应节点A、B、C、D adj_matrix = [ [0, 2, 0, 0], # A与B是双向关系 [2, 0, 1, 0], # B与A双向、B到C单向 [0, 0, 0, 2], # C与D双向 [1, 0, 2, 0] # D到A单向、D与C双向 ] nodes = ["A", "B", "C", "D"]
2. 生成边列表
遍历矩阵,根据数值生成对应类型的边:
edges = [] for i in range(len(nodes)): for j in range(len(nodes)): val = adj_matrix[i][j] if val == 1: # 单向边:行节点指向列节点 edges.append((nodes[i], nodes[j])) elif val == 2: # 双向边:添加两个方向的边,确保箭头双向显示 edges.append((nodes[i], nodes[j])) edges.append((nodes[j], nodes[i]))
3. 构建有向图并可视化
创建有向图对象,添加节点和边后绘图:
# 创建有向图(必须开启directed才能显示单向/双向箭头) g = ig.Graph(directed=True) g.add_vertices(nodes) g.add_edges(edges) # 配置可视化参数,让箭头和节点更清晰 visual_style = { "vertex_size": 35, "vertex_label": nodes, "vertex_label_size": 12, "edge_arrow_size": 0.8, "layout": g.layout("circle") # 环形布局,也可替换为"kamada_kawai"等 } # 绘制并展示图形 ig.plot(g, **visual_style)
关键说明
- 必须创建有向图(
directed=True),才能区分单向箭头和双向箭头 - 双向关系通过添加两个方向的边实现,绘图时会自动显示双向箭头
- 若想简化双向边的处理,也可先构建无向图再转为有向,但直接添加双向边更贴合题目对箭头展示的要求
内容的提问来源于stack exchange,提问作者Kolmogorovwannabe
相关产品推荐
相关产品推荐

