3、make_系列:igraph的建图工具
按照定义,正则图是指各顶点的度均相同的无向简单图,因为我目前没有找到描述度相等的有向(或自环图)的标准名称,所以在本文中借用一下这个概念,并加上定语有向无向,用以描述那些图中所有顶点度相同的有向图或无向图,包括简单图和多重图。
3-1 弦环图:make_chordal_ring(),返回无向正则图,d=4
我不是学数学的,平时用不上这个概念。百度半天,没有满意的解答。在igraph官网中找到这样一句话:
A graph is chordal if and only if any two neighbors of a vertex which are higher in rank than it are connected to each other.翻译过来,是图是弦图,当且仅当比一个顶点的秩高的任意两个邻居会彼此连接。
这里顶点的秩(rank)似乎指数按照顶点ID排序得到的顺序数。这种图的创建方法,首先创建一个环图,然后按照参数w的值,为图添加边,从而创建一个正则图(图中各个顶点的度相同)。因为得到的是一个正则图,所以各个顶点的度都相同,也就是参数矩阵的元素个数。而矩阵中的元素值,则规定了对应的顶点具体和图中哪些顶点连接而生成边。
igraph包帮助文档翻译过来大致是:
创建一个扩展弦环。扩展弦环是正则图,每个节点都有相同的度。它可以通过添加矩阵指定的一些额外边从简单环中获得。设p表示“W”矩阵中的列数。顶点i的额外边是根据“W”中的列i mod p添加的。额外边的数量是“W”中的行数:对于每一行j,如果i+W[ij]小于总节点的数量,则添加一条边i->i+W[ij]
虽然里面说了怎样计算,但我水平太低,没整明白,主要是平时用不上。
3-2 德布鲁因图:make_de_bruijn_graph
,返回有向正则图(d=2m)
德布鲁因图可以百度出很多链接,据说是目前二代测序组装基因组的工具的核心基础,但对我这种小白而言太高大上了,用不上。
igraph帮助文档说:德布鲁因图表示字符串之间的关系。使用m个字母的字母表,并考虑长度为n的字符串。一个顶点对应于每一个可能的字符串,如果v的字符串可以通过删除其第一个字母并在其上附加一个字母来转换为w的字符串,则从顶点v到顶点w有一条有向边。请注意,该图将有m到n次方的顶点,甚至有更多的边,所以你可能不想为m和n提供太大的数字。
> g <- make_de_bruijn_graph(3,3)
> table(degree(g))
6
27
德布鲁因图是正则图,每个顶点的度是make_de_bruijn_graph(m, n)
中参数m的两倍(2m),顶点总数是m的n次方。
3-3 完全图: make_full_graph
返回无向正则图,d=gorder(g)
假设一个图有n个顶点,那么如果任意两个顶点之间都有边的话,该图就称为完全图。
3-4 完全引文图:make_full_citation_graph
,返回有向正则图(d=gorder(g)-1)
> g <- make_full_citation_graph(10)
> print_all(g)
IGRAPH f03e9bf D--- 10 45 -- Full citation graph
+ attr: name (g/c)
+ edges:1 -> 2 -> 1 3 -> 1 2 4 -> 1 2 3 5 -> 1 2 3 4 6 -> 1 2 3 4 5 7 -> 1 2 3 4 5 6 8 -> 1 2 3 4 5 6 7 9 -> 1 2 3 4 5 6 7 8 10 -> 1 2 3 4 5 6 7 8 9
3-5 空图:make_empty_graph
igraph中,空图是不含边的图,所以,本函数可以设置顶点数、是否有向。
3-6 Prufer序列:make_from_prufer
根据知乎:Prufer序列,又称Prufer code。
对于一棵n(n>=2) 个节点的标定树(节点带编号),其Prufer序列是一个长度为 n-2 ,值域为[1,n] 的整数序列。
每棵树必定存在Prufer序列且唯一,每个Prufer序列对应的树也必定存在且唯一,即二者为双射关系。
将树转化为Prufer序列:
①从树上选择编号最小的叶子节点,序列的下一位为其父节点的编号。
②删去该叶子节点。
③重复①和②,直到树只剩下两个节点,此时序列的长度刚好为n-2
上图中,1中所有叶节点包括1、4、5、6、7,其中最小的是节点1;
2中,删除叶节点1,并把节点1的父节点编号2存入Prufer序列,序列更新为:2
3中,删除当前最小的叶节点4,并把节点4的父节点编号2存入Prufer序列:2,序列更新为:2,2
4中,删除当前最小的叶节点5,并把节点5的父节点编号3存入Prufer序列:3,序列更新为:2,2,3
5中,删除当前最小的叶节点6,并把节点5的父节点编号3存入Prufer序列:3,序列更新为:2,2,3,3
6中,删除当前最小的叶节点3,并把节点3的父节点编号2存入Prufer序列:3,序列更新为:2,2,3,3,2,至此,树只剩下两个节点,算法结束。
Prufer序列的性质:
1)构造完后剩下的两个节点里,一定有一个是编号最大的节点。
2)对于一个 n度的节点,其必定在序列中出现 n-1次,因为每次删去其子节点它都会出现一次,最后一次则是删除其本身。一次都未出现的是原树的叶子节点。
igraph是这样做的:
如果图有两个以上的顶点,请找到一个阶度为1的顶点(等同叶节点),将其从树中移除,并将其连接到的顶点的标签添加到序列中。重复此操作,直到剩余图形中只有两个顶点为止。
> g <- make_tree(13,3)
> plot(g,layout=layout_as_tree)
> to_prufer(g)[1] 2 2 2 1 3 3 3 1 4 4 4
3-7 二部图:make_full_bipartite_graph
g <- make_full_bipartite_graph(2, 3)
plot(g,layout=layout.bipartite)
本函数默认参数有from_type\to_type,用于设置边的方向
> g <- make_full_bipartite_graph(2, 3,directed = TRUE,mode = 'in')
> plot(g,layout=layout.bipartite)
> igraph::as_long_data_frame(g)from to from_type to_type
1 3 1 TRUE FALSE
2 4 1 TRUE FALSE
3 5 1 TRUE FALSE
4 3 2 TRUE FALSE
5 4 2 TRUE FALSE
6 5 2 TRUE FALSE
3-7 特殊结构图:make_graph
- Bull:公牛图有5个顶点和5条边,如果绘制得当,它类似于公牛的头部
Chvatal:这是最小的无三角形图,既是4色图,也是4-正则图。根据Grunbaum猜想,对于每m>1和n>2,存在一个具有n个顶点的m-正则m-色图。Chvatal图是m=4和n=12的一个例子。它有24条边。
-
Coxeter:具有28个顶点和42条边的非Hamilton三次对称图
-
Cubical:立方体的柏拉图图形。一种有8个顶点和12条边的凸正多面体。
-
Diamond:一个有4个顶点和5条边的图,如果正确绘制,则类似于示意图中的菱形
-
Dodecahedron:具有20个顶点和30条边的另一个柏拉图式实体。
-
Folkman:具有最小顶点数、20和40条边的半对称图。半对称图是正则的,边可传递的,而不是顶点可传递的
-
Franklin:这是一个嵌入到克莱因瓶上的图,它可以用六种颜色来着色,它是对克莱因瓶Heawood猜想必要性的反例。它有12个顶点和18条边。
-
Frucht:Frucht图是最小的三次图,其自同构群仅由单位元素组成。它有12个顶点和18条边
-
Grotzsch:是一个无三角形图,有11个顶点,20条边,色数为4。它是以德国数学家Herbert Groetzsch的名字命名的,它的存在证明了平面性的假设在Groetzsh定理中是必要的,即每个无三角形平面图都是3-色的
-
Heawood:是一个有14个顶点和21条边的无向图。图是三次图,图中的所有循环都有六条或更多条边。每一个较小的三次图都有较短的循环,所以这个图是6笼,周长为6的最小三次图
-
Herschel:是最小的非哈密尔顿多面体图。它是11个节点上唯一的此类图,具有18条边
-
House:是一个5顶点、6边的图,如果直接绘制,基本上是正方形顶部的三角形
-
HouseX:House图的正方形中带有X。5个顶点和8条边。
-
Icosahedron:二十面体,具有12个顶点和30条边的柏拉图式实体
-
Krackhardt kite:一个有10个顶点和18条边的社交网络
-
Levi:该图是一个4弧传递三次图,它有30个顶点和45条边
-
McGee:麦基图是唯一的3-正则7-笼图,它有24个顶点和36条边。
-
Meredith:是一个在70个节点和140条边上的四次图,这是对每个4-正则4-连通图都是Hamilton图的猜想的反证。
-
Noperfectmatching:一个有16个顶点和27条边的连通图,不包含完全匹配。图中的匹配是一组成对的不相邻边;也就是说,没有两条边共享一个公共顶点。完美匹配是覆盖图的所有顶点的匹配
-
Nonline:一个图的连通分量是图中作为顶点诱导子图存在的9个图,它构成了一个非线性图。它有50个顶点和72条边。
-
Octahedron:具有6个顶点和12条边的八面体柏拉图立体
-
Petersen:一个有10个顶点和15条边的3-正则图。它是最小的次哈密尔顿图,即它是非哈密尔顿的,但从中去掉任何一个顶点都使它成为哈密尔顿的
- Robertson:唯一的(4,5)-笼图,即周长为5的4-正则图。它有19个顶点和38条边。
-
Smallestcyclicgroup:一个最小的非平凡图,其自同构群是循环的。它有9个顶点和15条边
-
Tetrahedron:具有4个顶点和6条边的柏拉图立体
-
Thomassen:最小的可形图,在34个顶点和52条边上。可形图不包含哈密顿路径,但在从图中移除任何单个顶点后,剩余的图总是包含哈密顿路径。包含哈密顿路径的图称为可追踪图。
-
Tutte:Tait的哈密尔顿图猜想指出,每一个3-连通的3-正则平面图都是哈密尔顿图。这张图是一个反例。它有46个顶点和69条边
-
Uniquely3colorable:返回一个12顶点的无三角形图,其色数为3,唯一为3色
- Walther:一个有25个顶点和31条边的恒等图。一个恒等图有一个单图自同构,平凡图
- Zachary:20世纪70年代,美国一所大学的空手道俱乐部34名成员之间的友谊社交网络。
手工输入建图的语法:
make_graph
也可以手动输入边来创建图。此时,函数的参数是一个定义边的向量,第一个边从第一个元素指向第二个元素,第二个边从第三个指向第四个元素,以此类推。对于数字向量,这些被解释为内部顶点id。对于字符向量,它们被解释为顶点名称。
从igraph 0.8.0开始,您还可以通过igraph的formula表示法在此处包含文字(请参见graph_from_literal())。在这种情况下,公式的第一项必须以“~”字符开头,就像R中的正则公式一样。参见以下示例
make_graph(~ A - B - C - D - A, E - A:B:C:D,F - G - H - I - F, J - F:G:H:I,K - L - M - N - K, O - K:L:M:N,P - Q - R - S - P, T - P:Q:R:S,B - F, E - J, C - I, L - T, O - T, M - S,C - P, C - L, I - L, I - P
)
注意: 参数必须以~
开头,:
不再是向量中序列的用法,1:4
不再表示1,2,3,4四个元素的向量,而是表示拥有{1,4}两个元素的集合。
3-8 make_kautz_graph
,与德布鲁因图相似,返回有向正则图(d=2m)
Kautz图是表示字符串重叠的定标图(Labeled graph)
Kautz图是一个定标图(Labeled graph),顶点由长度为n+1的字符串标记,字符串位于m+1个字母的字母表之上,限制条件是字符串中的每两个连续字母必须不同。如果可以通过移除第一个字母并在其上附加一个字母将v的字符串转换为w的字符串,则存在从顶点v到另一个顶点w的有向边
3-9 栅格图:make_lattice
3-10 图的线图:make_line_graph
G无向图的线图L(G)定义如下。L(G)对于G中的每条边都有一个顶点,并且如果它们的对应边共享一个端点,则L(G)中的两个顶点通过一条边连接。G有向图的线图L(G)略有不同,如果第一个顶点的对应边的目标与第二个顶点的相应边的源相同,则L(G)。
注意:本函数的参数是图(graph类),不是顶点或边。