图形生成
大多数igraph应用的第一步是生成一个图。本节将解释几种实现这一目标的方法。有关每个函数和类的详细信息,请阅读API参考。
Graph 类是用于生成图形的主要对象:
>>> from igraph import Graph
要复制一个图形,请使用 Graph.copy():
>>> g_new = g.copy()
从节点和边
节点总是从0开始编号。要创建一个具有指定数量节点(例如10)及其之间边列表的通用图,您可以使用通用构造函数:
>>> g = Graph(n=10, edges=[[0, 1], [2, 3]])
如果未指定,图形是无向的。要创建有向图:
>>> g = Graph(n=10, edges=[[0, 1], [2, 3]], directed=True)
要指定边的权重(或任何其他顶点/边属性),请使用字典:
>>> g = Graph(
... n=4, edges=[[0, 1], [2, 3]],
... edge_attrs={'weight': [0.1, 0.2]},
... vertex_attrs={'color': ['b', 'g', 'g', 'y']}
... )
要从类型列表和边列表创建二分图,请使用 Graph.Bipartite()。
从Python内置结构(列表、元组、字典)
igraph 支持多种“转换”方法,可以从 Python 内置数据结构(如字典、列表和元组)中导入图:
Graph.DictList(): 从字典列表中
Graph.TupleList(): 从元组列表中
Graph.ListDict(): 从列表的字典中
Graph.DictDict(): 从字典的字典中创建
等效的方法可用于导出图形,即将图形转换为使用Python内置数据结构的表示形式:
查看每个函数的API参考以获取详细信息和示例。
从矩阵
要从邻接矩阵创建图,请使用 Graph.Adjacency() 或者,对于加权矩阵,使用 Graph.Weighted_Adjacency():
>>> g = Graph.Adjacency([[0, 1, 1], [0, 0, 0], [0, 0, 1]])
这个图是有向的,并且有边 [0, 1]、[0, 2] 和 [2, 2](一个自环)。
要从二分邻接矩阵创建二分图,请使用 Graph.Biadjacency():
>>> g = Graph.Biadjacency([[0, 1, 1], [1, 1, 0]])
从文件
要从支持格式的文件中加载图形,请使用 Graph.Load()。例如:
>>> g = Graph.Load('myfile.gml', format='gml')
如果你没有指定格式,igraph 会尝试自动识别,如果识别失败,它会报错。
来自外部库
igraph 可以读取和写入 networkx 和 graph-tool 图格式:
>>> g = Graph.from_networkx(nwx)
和
>>> g = Graph.from_graph_tool(gt)
从 pandas DataFrame(s)
一种常见的做法是将边存储在pandas.DataFrame中,其中前两列是源顶点和目标顶点的ID,任何额外的列表示边的属性。您可以通过Graph.DataFrame()生成一个图:
>>> g = Graph.DataFrame(edges, directed=False)
可以通过一个单独的DataFrame同时设置顶点属性。第一列假定包含所有顶点ID(包括没有任何边的顶点),任何额外的列都是顶点属性:
>>> g = Graph.DataFrame(edges, directed=False, vertices=vertices)
从公式
要从字符串公式创建图形,请使用 Graph.Formula(),例如:
>>> g = Graph.Formula('D-A:B:F:G, A-C-F-A, B-E-G-B, A-B, F-G, H-F:G, H-I-J')
注意
这个特定的公式还为顶点分配了‘name’属性。
完全图
要创建一个完整的图,请使用 Graph.Full():
>>> g = Graph.Full(n=3)
其中 n 是节点的数量。您可以指定是否有向以及是否包含自环:
>>> g = Graph.Full(n=3, directed=True, loops=True)
类似的方法,Graph.Full_Bipartite(),生成一个完全二分图。最后,方法 Graph.Full_Citation() 创建了完整的引用图,其中索引为 i 的顶点有一条有向边指向所有索引严格小于 i 的顶点。
树和星星
Graph.Tree() 可以用来生成规则的树,其中几乎每个顶点都有相同数量的子节点:
>>> g = Graph.Tree(n=7, n_children=2)
创建一个有七个顶点的树 - 其中四个是叶子。根节点(0)有两个子节点(1和2),每个子节点又有两个子节点(四个叶子)。常规树可以是有向的或无向的(默认)。
方法 Graph.Star() 创建一个星形图,它是树的一个子类型。
格子
Graph.Lattice() 创建一个选定大小的规则方形格子。例如:
>>> g = Graph.Lattice(dim=[3, 3], circular=False)
创建一个二维的3×3网格(总共9个顶点)。circular用于将网格的每条边连接到另一侧,这个过程也被称为“周期性边界条件”,有时有助于平滑边缘效应。
一维情况(路径图或环图)非常重要,值得拥有自己的构造函数 Graph.Ring(),它可以是环形的,也可以不是:
>>> g = Graph.Ring(n=4, circular=False)
图集
罗兰·C·里德和罗宾·J·威尔逊所著的《图集》一书包含了所有最多七个顶点的未标记无向图,编号从0到1252。您可以通过索引使用Graph.Atlas()从该列表中创建任何图,例如:
>>> g = Graph.Atlas(44)
图表如下:
按节点数量递增的顺序;
对于固定数量的节点,按边数的增加顺序排列;
对于固定数量的节点和边,按照度序列的递增顺序排列,例如 111223 < 112222;
对于固定的度序列,随着自同构数量的增加。
著名图表
在igraph C核心手册上可以找到一个精选的著名图列表,这些图通常用于文献中的基准测试和其他目的。您可以通过名称生成该列表中的任何图,例如:
>>> g = Graph.Famous('Zachary')
将教你一些关于武术的知识。
随机图
随机图可以根据几种不同的模型或游戏创建:
Barabási-Albert 模型:
Graph.Barabasi()Erdős-Rényi:
Graph.Erdos_Renyi()Watts-Strogatz
Graph.Watts_Strogatz()随机块模型
Graph.SBM()随机树
Graph.Tree_Game()森林火灾游戏
Graph.Forest_Fire()随机几何图
Graph.GRG()增长
Graph.Growing_Random()建立游戏
Graph.Establishment()偏好,非增长的建立变体
Graph.Preference()不对称偏好
Graph.Asymmetric_Prefernce()最近的度数
Graph.Recent_Degree()k-正则(每个节点的度数为k)
Graph.K_Regular()非增长图,其边的概率与节点适应度成比例
Graph.Static_Fitness()具有指定幂律度分布的非增长图
Graph.Static_Power_Law()具有给定度序列的随机图
Graph.Degree_Sequence()
其他图表
最后,还有一些生成图表的方法未在前面的章节中涵盖:
Kautz图
Graph.Kautz()德布鲁因图
Graph.De_Bruijn()从LCF表示法生成的图
Graph.LCF()任何“同构类”的小图
Graph.Isoclass()具有指定度序列的图
Graph.Realize_Degree_Sequence()