r - 在有向图中设置方向
问题描述
我有以下无向图g
,它是从河流的 shapefile 生成的。我想转换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)
我可以看到问题是由邻接矩阵中的顶点如何标记但无法提出解决方案造成的。
我的问题:是否可以将无向图转换为所有边的方向都指向选定顶点(在本例中为顶点 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)
注意:所有箭头的方向可以通过更改为 来outer(d, d, FUN = '>')
反转outer(d, d, FUN = '<')
。
推荐阅读
- css - 用背景颜色完全填充页面
- android - 在 android mvvm 架构中使用位置 api 的正确位置
- ruby - RestClient 在 ruby on rails 中发布请求
- c# - 我可以在不使用 HtmlAgilityPack 之类的 3rd 方库的情况下抓取 HTML 类吗?
- mysql - 是否可以在 my.ini 文件中存储密码?
- .htaccess - 如何htaccess从index.php重定向到/仅在特定文件夹中?
- java - Android 谷歌地图、移动标记崩溃应用
- powershell - PS脚本在文件类型中打印目录名称
- mongodb - mongodb:在其他文档中按条件查找所有记录
- html - 为什么标题框元素超出正文框元素?