r - 在有向图中设置方向

标签 r igraph

我有以下无向图g,它是从河流的形状文件生成的。我想将 g 转换为有向图,其中顶点 55 是根,所有边的“方向”都朝向根顶点(想象一下水从网络的所有部分流向根)。

无向图示例:

library(igraph)

g <- structure(list(From = c(48, 37, 39, 32, 38, 36, 49, 46, 31, 26, 
      33, 35, 18, 23, 45, 41, 42, 47, 52, 51, 50, 54, 16, 14, 8, 10, 
      5, 6, 17, 11, 20, 24, 2, 3, 1, 0, 44, 4, 7, 29, 30, 34, 40, 53, 
      43, 15, 9, 28, 27, 12, 13, 19, 21, 22, 25), To = c(32, 32, 31, 
        31, 33, 33, 45, 45, 23, 23, 26, 26, 16, 16, 35, 35, 41, 41, 50, 
        50, 47, 47, 6, 6, 5, 5, 2, 2, 10, 10, 11, 11, 1, 1, 0, 55, 30, 
        3, 3, 28, 28, 29, 29, 40, 40, 7, 7, 22, 22, 9, 9, 13, 13, 19, 
        19)), class = "data.frame", row.names = c(NA, -55L))

g <- graph.data.frame(g, directed = FALSE) 

l <- igraph::layout_as_tree(g, flip.y = FALSE)
plot(g,
    vertex.size = 10,
    vertex.color = "darkgray",
    layout = l)

我可以执行以下操作来创建有向图,但有些边的方向是正确的,而另一些则不是。

g2 <- get.adjacency(g, sparse = F)
g2[upper.tri(g2)] <- 0
g2 <- igraph::graph.adjacency(g2)

plot(g2,
      vertex.size = 10,
      vertex.color = "darkgray",
      layout = l)

enter image description here

我可以从邻接矩阵中的顶点如何标记中看出问题的结果,但无法提出解决方案。

我的问题:是否可以将无向图转换为有向图,其中所有边的方向都朝向选定的顶点(在本例中为顶点 55)?

如果顶点被重命名等也很好。

最佳答案

对于连接顶点a和b的每条边,如果a到55的最短距离小于b到55的最短距离,则b应该朝向a。我不熟悉igraph ,但我根据这个理由想出了一种方法:

d <- distances(g)[, '55']
dd <- outer(d, d, FUN = '>')

g2 <- get.adjacency(g, sparse = F)
g2 <- g2 * dd
g2 <- igraph::graph.adjacency(g2)

plot(g2,
    vertex.size = 10,
    vertex.color = "darkgray",
    layout = l)

enter image description here

注意:所有箭头的方向都可以通过改变 outer(d, d, FUN = '>') 来反转。至outer(d, d, FUN = '<') .

关于r - 在有向图中设置方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61201346/

相关文章:

r - 在 R data.frame 中,将行名提升为实际列

r - 在 SparkR 中使用 CRAN 包

r - 根据特定条件拥有数据集的子集

r - 在图论中解释社区结构

python - IGraph 选择性能

r - 将数据帧转换为 igraph 错误 : Duplicate vertex names

r - 如何使用igraph将两个节点合并为单个节点

r - < 在 data.table 中代表什么与 on= 连接

r - 使用 igraph 在 R 中绘制多个离散网络

r - 使用 R igraph 和 dplyr (purrr) 在列表柱图中有条件地设置边属性