官方参考文档http://www.cs.rhul.ac.uk/home/tamas/development/igraph/tutorial/tutorial.html
从igraph模块中导入所有函数
from igraph import *
g = Graph(1) # 此时的graph只有1个顶点,0条边
print(g)
Out: IGRAPH U— 1 0 –
Graph.add_vertices()的作用是给graph添加顶点数,并且返回这个graph
g.add_vertices(2) # 此时的graph有3个顶点,0条边
graph的顶点从0开始标号,即3个顶点对应编号为0, 1, 2
1.Graph.add_edges()的作用是添加边的,边必须由整数对指定,比如(0, 1)表示顶点0与顶点1之间添加边
2.函数添加边时需要列表符号[]
3.当添加的边的顶点编号不存在比如g.add_edges((5, 0)),程序报错
4.边也存在编号,同样是从0开始
g.add_edges([(0, 1), (1, 2)]) # 此时的graph有3个顶点,2条边
# 添加更多的边和顶点数
g.add_edges([(2, 0)])
g.add_vertices(3)
g.add_edges([(2, 3), (3, 4), (4, 5), (5, 3)])
Out: IGRAPH U— 6 7 –
edges: 0–1 1–2 0–2 2–3 3–4 4–5 3–5
此时的graph (无向图)6个顶点,7条边;edges表示哪些顶点之间存在边的关系
delete_edges()作用为边的删除,函数需要由边的编号组成的列表或者是单独的边的编号
1.delete_edges()作用为顶点的删除,函数需要由顶点的编号组成的列表或者是单独的顶点的编号
get_eid作用为获取连接两个顶点边的编号,当你不知道需要删除的边的编号时,可以使用这个函数
g.get_eid(2, 3) # out: 3
# 此时graph删除编号为3的边
g.delete_edges(3)
print(g)
Out: IGRAPH U— 6 6 –
edges: 0–1 1–2 0–2 3–4 4–5 3–5
summary()作用是获取给定的graph的概述
1.列举出边和顶点的个数
2.检查图有向或无向
3.计算图连通分量的个数
4.计算图的直径, 边缘密度,平均路径的长度
summary(g)
官方文档上的结果是 :
Out: 6 vertices, 6 edges, undirected
Number of components: 2
Diameter: 1
Density: 0.4000
Average path length: 1.0000
我自己运行的结果是:
Out: IGRAPH U— 6 6 –
不知道哪里出了问题,可能跟igraph的版本有关
igraph包含了大量的图生成器,具体可以被分为两大类,确定性图生成器和随机性图生成器
确定性图生成器:只要输入相同的参数,就会生成相同的图
随机性图生成器即每次都生成不同的图
Graph.Tree()作用是生成一个常规的树形图
g1 = Graph.Tree(127, 2)
summary(g1)
Out: IGRAPH U— 127 126 –
生成127个节点;除叶子节点,每个节点有两个子节点
只要参数不改变,生成的图都是一样的
g2 = Graph.Tree(127, 2)
get_edgelist()作用是返回包含整数对的列表
其中的整数对就是边两端的顶点整数对
g2.get_edgelist() == g1.get_edgelist() # out: True
证明了 只要参数不改变,生成的图都是一样的
输出前10条边对应的顶点整数对
print(g2.get_edgelist()[0: 10])
Out: [(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), (2, 6), (3, 7), (3, 8), (4, 9), (4, 10)]
Graph.GRG()作用是生成一个几何随机图
原理是在单位正方形里随机均匀的选择n个点,任意两个点之间的距离如果比预定的距离d小,就用边相连
g1 = Graph.GRG(100, 0.2)
summary(g1)
Out: IGRAPH U— 100 509 –
因为是随机生成图,无论是同一个参数,同一台电脑,每次生成的图都不一样
验证:
g2 = Graph.GRG(100, 0.2)
g1.get_edgelist() == g2.get_edgelist()
Out: False
isomorphic()作用是判断两个图是不是同构图,即两个图是否完全等价
原理是检查两个图顶点的度
g1.isomorphic(g2)
Out: False
手动创建一个设想中的社交关系图 顶点表示人,边代表他们之间的社交关系
g = Graph([(0,1), (0,2), (2,3), (3,4), (4,2), (2,5), (5,0), (6,3), (5,6)])
创建额外的列表储存信息与顶点ID相关联 每个Graph都包含两个特殊的成员: vs表示所有顶点的序列;es表示所有边的序列 如果使用vs或es作为字典,可以操作图的属性存储区域
g.vs["name"] = ["Alice", "Bob", "Claire", "Dennis", "Esther", "Frank", "George"]
g.vs["age"] = [25, 31, 18, 47, 22, 23, 50]
g.vs["gender"] = ["f", "m", "f", "m", "f", "m", "m"]
g.es["is_formal"] = [False, False, True, True, True, False, True, False, False]
当使用vs或es作为字典,都在将属性分配给图的所有顶点或边;
可以使用下标索引号对单独的顶点或边进行修改
g.es[0]
Out: igraph.Edge(<igraph.Graph object at 0x000002CA4CDB1228>, 0, {‘is_formal’: False})
g.es[0].attributes()
Out: {‘is_formal’: False}
g.es[0]["is_formal"]
Out: False
使用下标索引号对属性进行修改
g.es[0]["is_formal"] = True
g.es[0]["is_formal"]
Out: True
无论是单独的索引号还是使用attributes()函数,都会输出此顶点或边的对应信息
g.vs[0]
Out: igraph.Vertex(<igraph.Graph object at 0x000002CA4CDB1228>, 0, {‘name’: ‘Alice’, ‘age’: 25, ‘gender’: ‘f’})
g.vs[0].attributes()
Out: {‘age’: 25, ‘gender’: ‘f’, ‘name’: ‘Alice’}
Grap本身也可以作为一个字典, 为整个图分配属性
g["date"] = "2021-10-30"
print(g["date"])
Out: 2021-10-30
del是python的关键词,可以直接删除属性
g.vs[3]["foo"] = "bar"
g.vs["foo"]
Out: [None, None, None, ‘bar’, None, None, None]
del g.vs["foo"]
g.vs["foo"]
Out: ‘Attribute does not exist’
igraph提供了很多函数计算不同图的结构属性
计算顶点的度
如果图是有向图,可以使用degree(type=“in”)和degree(type=“out”)计算入度和出度
g.degree()
Out: [3, 1, 4, 3, 2, 3, 2]
也可以输入单个顶点ID或者是一个列表的顶点ID查询,如果省略括号内的内容就默认为顶点的集合
g.degree(6)
g.degree([2, 3, 4])
Out: 2
Out: [4, 3, 2]