BioC项目中,网络图的处理通过不同的软件包进行:
- graph:图实现方法、类定义(graphNEL、graphAM和graphBAM)和基本函数
- RBGL:针对BioC graph类对象提供Boost图算法接口函数,如最短路径、最大流量、连通性等
- gRbase:提供了bgraph和igraph图间的转换函数(as),生成网络函数比graph的函数更好用
- Rgraphviz:graph对象的渲染,包括布局算法和图形可视化参数
图的类型与生成
graphNEL类
- 由node和edge列表(NEL)表示的图
- BioC的图是S4类对象,使用构造函数生成对象,构造函数名称和类名称相同
- 构造函数graphNEL有nodes,edgeL和edgemode三个参数,分别设置节点名称,边列表和边的模式(directed/undirected)
- nodes接收字符向量,每个向量元素表示一个节点名称
- edgeL接收列表数据,列表的每个元素(第一层)也是列表
- 列表第一层的长度必须和nodes相同,且列表元素的名称为节点的名称(即每个节点都要设置边)
- 元素可为NULL或具名列表;如果是列表,元素edges为终点顶点的名称或索引向量,还可以包含其他元素表示各条边的属性
library(graph)
V <- LETTERS[1:4]
edL <- list(A = list(edges = c("B", "C")), B = NULL, C = list(edges = "B"), D = list(edges = c("A", "C")))
gx <- graphNEL(nodes = V, edgeL = edL, edgemode = "directed")
plot(gx)
![](https://img-blog.csdnimg.cn/202102102114589.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ4MDExNTc=,size_16,color_FFFFFF,t_70)
nodes(gx)
#> [1] "A" "B" "C" "D"
edges(gx)
#> $A
#> [1] "B" "C"
#>
#> $B
#> character(0)
#>
#> $C
#> [1] "B"
#>
#> $D
#> [1] "A" "C"
获取graphNEL对象节点和边的函数分别是nodes和edges。可以看到,nodes得到的是节点名称,而edges得到的是一个列表,每个列表元素表示从一个节点(列表元素的名称)出发到其他所有节点(列表元素的值)的边。
graphNEL对象的边默认具有weight属性,不需要额外声明:
edgeWeights(gx)
#> $A
#> B C
#> 1 1
#>
#> $B
#> numeric(0)
#>
#> $C
#> B
#> 1
#>
#> $D
#> A C
#> 1 1
graphAM和graphBAM类
两者都用邻接矩阵表示的图,但生成函数和存储方式有差别:
- graphAM使用矩阵产生边列表
- graphBAM使用数据框产生列表,数据框含权重列
str(graphAM)
#> function (adjMat = matrix(integer(), 0, 0), edgemode = "undirected", values = NA)
str(graphBAM)
#> function (df, nodes = NULL, edgemode = "undirected", ignore_dup_edges = FALSE)
基本操作
网络/图的基本操作是节点和边的操作,主要包括元素提取、添加、删除和属性设置等。
提取
- 节点的提取较为简单,使用nodes函数
- 边的提取方法较多,除前面介绍的edges外还有inEdges, adj, edgeL等
adj(gx, "C")
#> $C
#> [1] "B"
adj(gx, c("B", "C"))
#> $B
#> character(0)
#>
#> $C
#> [1] "B"
adj(gx, nodes(gx))
#> $A
#> [1] "B" "C"
#>
#> $B
#> character(0)
#>
#> $C
#> [1] "B"
#>
#> $D
#> [1] "A" "C"
edges(gx)
#> $A
#> [1] "B" "C"
#>
#> $B
#> character(0)
#>
#> $C
#> [1] "B"
#>
#> $D
#> [1] "A" "C"
adj函数用法和edges函数的差别是可以指定节点。如果指定所有节点,得到的结果和edges函数相同。
edges和adj函数查询的是从某个节点出发的边,即outEdges;如果想查询进入某个节点的边,用inEdges函数:
inEdges("C", gx)
#> $C
#> [1] "A" "D"
inEdges(c("B", "C"), gx)
#> $B
#> [1] "A" "C"
#>
#> $C
#> [1] "A" "D"
注意:graph包没有定义outEdges函数。虽然adj函数可以达到同样效果,但名称不对称、参数顺序不对应,这种设计真不太美。我倾向于给adj写一个替身函数:
outEdges <- function(es, g) adj(g, es)
inEdges("C", gx)
#> $C
#> [1] "A" "D"
outEdges("C", gx)
#> $C
#> [1] "B"
edgeL和listEdges的设计可能有特殊考虑,暂时不知道有什么不可替代的优点:
edgeL(gx)
#> $A
#> $A$edges
#> [1] 2 3
#>
#>
#> $B
#> $B$edges
#> numeric(0)
#>
#>
#> $C
#> $C$edges
#> [1] 2
#>
#>
#> $D
#> $D$edges
#> [1] 1 3
listEdges(gx)
#> $`A:B`
#> $`A:B`[[1]]
#> An object of class "simpleEdge"
#> Slot "edgeType":
#> [1] ""
#>
#> Slot "weight":
#> [1] 1
#>
#> Slot "directed":
#> [1] TRUE
#>
#> Slot "bNode":
#> [1] "A"
#>
#> Slot "eNode":
#> [1] "B"
#>
#>
#>
#> $`A:C`
#> $`A:C`[[1]]
#> An object of class "simpleEdge"
#> Slot "edgeType":
#> [1] ""
#>
#> Slot "weight":
#> [1] 1
#>
#> Slot "directed":
#> [1] TRUE
#>
#> Slot "bNode":
#> [1] "A"
#>
#> Slot "eNode":
#> [1] "C"
#>
#>
#>
#> $`B:C`
#> $`B:C`[[1]]
#> An object of class "simpleEdge"
#> Slot "edgeType":
#> [1] ""
#>
#> Slot "weight":
#> [1] 1
#>
#> Slot "directed":
#> [1] TRUE
#>
#> Slot "bNode":
#> [1] "C"
#>
#> Slot "eNode":
#> [1] "B"
#>
#>
#>
#> $`A:D`
#> $`A:D`[[1]]
#> An object of class "simpleEdge"
#> Slot "edgeType":
#> [1] ""
#>
#> Slot "weight":
#> [1] 1
#>
#> Slot "directed":
#> [1] TRUE
#>
#> Slot "bNode":
#> [1] "D"
#>
#> Slot "eNode":
#> [1] "A"
#>
#>
#>
#> $`C:D`
#> $`C:D`[[1]]
#> An object of class "simpleEdge"
#> Slot "edgeType":
#> [1] ""
#>
#> Slot "weight":
#> [1] 1
#>
#> Slot "directed":
#> [1] TRUE
#>
#> Slot "bNode":
#> [1] "D"
#>
#> Slot "eNode":
#> [1] "C"
- 以上函数除edgeL外,节点的均以名称表示,而不是索引
- listEdges可获得simpleEdge类S4边列表对象
添加/删除
addNode,addEdge,removeNode和removeEdge函数
- 由于graph包定义的图有多种类型,以上函数都是泛型
- 添加节点可同时添加边(以新节点为终点)
- 删除节点同时会删除与节点相关的边
属性设置
属性即数据。除顶点名称和边列表外,graphNEL对象还存储了四种数据,它们的名称和数据类型如下:
getSlots("graphNEL")
#> nodes edgeL edgeData nodeData renderInfo graphData
#> "vector" "list" "attrData" "attrData" "renderInfo" "list"
顶点和边的属性
辅助函数和属性数据的Slot名称相同,即nodeData和edgeData
str(nodeData(gx))
#> List of 4
#> $ A: list()
#> $ B: list()
#> $ C: list()
#> $ D: list()
str(edgeData(gx))
#> List of 5
#> $ A|B:List of 1
#> ..$ weight: num 1
#> $ A|C:List of 1
#> ..$ weight: num 1
#> $ C|B:List of 1
#> ..$ weight: num 1
#> $ D|A:List of 1
#> ..$ weight: num 1
#> $ D|C:List of 1
#> ..$ weight: num 1
- nodeData默认属性为空
- edgeData默认至少有一个权重属性
unlist(edgeWeights(gx))
#> A.B A.C C.B D.A D.C
#> 1 1 1 1 1
sapply(edgeData(gx), FUN = function(x) x$weight)
#> A|B A|C C|B D|A D|C
#> 1 1 1 1 1
图形渲染和图属性
名称为renderInfo和graphData,没有获取数据的专用辅助函数,可直接使用@操作符获取。
gx@graphData
#> $edgemode
#> [1] "directed"
gx@renderInfo
#> An object of class "renderInfo"
#> Slot "nodes":
#> list()
#>
#> Slot "edges":
#> list()
#>
#> Slot "graph":
#> list()
#>
#> Slot "pars":
#> list()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)