根据顶点强度分配边缘方向

时间:2019-07-12 21:59:58

标签: r igraph

我有一个无向图。我想基于顶点强度假定边缘方向,以便创建一个有向图,所有边缘都指向每个边缘中强度更高的顶点。

我发现的唯一解决方案是按方向定向,但这似乎只能为每个边缘分配随机方向。

例如我有一个包含5个顶点和6条边的简单图形

V(g)

+ 5/5 vertices, named, from 003341a:
[1] A B C D E
strength(g)

 A  B  C  D  E 
81 40 21 30 30  
E(g)

+ 6/6 edges from 003341a (vertex names):
[1] A--B A--C A--D A--E B--E D--E

我想基于强度设置方向性,以使该方向朝向更高强度的顶点。

以下是dput(g)的输出:

dput(g)

structure(list(5, FALSE, c(1, 2, 3, 4, 4, 4), c(0, 0, 0, 0, 1, 
3), c(0, 1, 2, 3, 4, 5), c(0, 1, 2, 3, 4, 5), c(0, 0, 1, 2, 3, 
6), c(0, 4, 5, 5, 6, 6), list(c(1, 0, 1), structure(list(), .Names = character(0)), 
    list(name = c("A", "B", "C", "D", "E")), list(weight = c(30L, 
    21L, 20L, 10L, 10L, 10L))), <environment>), class = "igraph")

这是我想要实现的方向性(但不知道当前如何实现):

E(g)

+ 6/6 edges from 003341a (vertex names):
[1] A<-B A<-C A<-D A<-E B<-E D<>E

1 个答案:

答案 0 :(得分:1)

有趣的问题!一种可能的解决方案是将强度添加为顶点属性,并根据相应顶点之间的差异生成新的边缘属性。

V(g)$strength <- strength(g)
ids <- get.edges(g, 1:ecount(g))
E(g)$weight1 <- V(g)$strength[ids[,1]] - V(g)$strength[ids[,2]]
E(g)$weight2 <- V(g)$strength[ids[,2]] - V(g)$strength[ids[,1]]

下一步是查看图的邻接矩阵:

m0 <- get.adjacency(g, sparse = F)
m0
> m0
  A B C D E
A 0 1 1 1 1
B 1 0 0 0 1
C 1 0 0 0 0
D 1 0 0 0 1
E 1 1 0 1 0

在这种情况下,我们有一个对称矩阵,该矩阵转换为无向图。现在的想法是删除所有将“较弱”顶点与更强顶点连接的条目(代表边)。为此,我们考虑了先前计算的边缘权重。我们对矩阵的两个“方向”(上下限)都执行此操作。

m <- get.adjacency(g, type = "lower", attr = "weight1", sparse = F)
m1 <- get.adjacency(g, type = "upper", attr = "weight2", sparse = F)

如果我们合并矩阵,我们将得到一个既有正边又有负边的矩阵。

m2 <- m1+m
> m2
   A   B   C   D   E
A  0 -41 -60 -51 -51
B 41   0   0   0 -10
C 60   0   0   0   0
D 51   0   0   0   0
E 51  10   0   0   0

由于我们只对指向强度更高的顶点的边感兴趣,因此我们删除了原始二进制邻接矩阵中的否定项。

m0[m2 < 0] <- 0
> m0
  A B C D E
A 0 0 0 0 0
B 1 0 0 0 0
C 1 0 0 0 0
D 1 0 0 0 1
E 1 1 0 1 0

我们可以从此处构建图形:

g2 <- graph_from_adjacency_matrix(m0, mode = "directed")
plot(g2)

结果图看起来像这样:

enter image description here


编辑我刚刚意识到您已经具有所需的边缘配对和方向。在这种情况下,您可以使用许多mode函数提供的directedigraph参数。参见例如:

?graph_from_data_frame

假设您是从现有边列表(el)生成图形的,那么您可以简单地编写如下内容:

g2 <- graph_from_data_frame(el, directed = T)