r - igraph:终端(非根)节点位于同一级别的树形图?

标签 r graph igraph network-analysis

我想在 R 中使用 igraph 绘制一个树形图,使所有终端节点都处于同一级别,这与默认情况下所有根节点都处于同一级别不同。

layout_as_tree 有一种基于根节点的方法可以做到这一点。需要指定它们 (root) 以及它们的级别 (rootlevel)。所以我可以使用这个选项,尽管它似乎涉及一个非常复杂的工作流程:a)将树分成子树b)查找每个子树的根节点c)查找每个子树的最大路径4)指定根第一级相对给别人...

是否有更简单的方法从终端节点开始执行此操作?假设我不知道哪些节点是根节点(1 和 11),但只知道哪些节点是终端节点(4:11 和 16:20)。

这是一个示例,但我希望终端节点 4、16 和 17 位于最低级别:

library(igraph)
tree2 <- make_tree(10, 3) + make_tree(10, 2)

plot(tree2, layout=layout_as_tree(tree2, root=c(1,11),
                                  rootlevel=c(2, 1)))

创建于 2022 年 9 月 23 日 reprex v2.0.2

最佳答案

当从下往上计算层数时,解变为:

require(igraph)

tree2  <- make_tree(10, 3) + make_tree(10, 2) + edge(1,5)
tree3  <- set_edge_attr(tree2, name="weight", value=-1) # longest path = shortest negative.
dist   <- (-distances(tree3, v=(V(tree3)), mode="out")) # matrix of VxV distances of shortest paths.
layers <- apply(dist, 1, max)                           # maximum distance from bottom to top (max per row).
layers <- max(layers) - layers                          # minimal distance from top    to bottom.

plot(tree3, layout=layout_with_sugiyama(tree3, layers=layers))

如果dist矩阵不适合内存,则必须执行dfs()搜索,计算层。

关于r - igraph:终端(非根)节点位于同一级别的树形图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73828475/

相关文章:

r - 翻转 gg TreeMap

html - JSP 中的垂直图条

python - igraph:绘制同一图的递增增长子图时如何固定节点位置

删除 r 中的相邻重复项

r - 将变量名称作为 data.table 中的参数传递

javascript - 如何为折线图指定限制颜色

python - pycairo "ImportError: DLL load failed: The specified module could not be found."即使在安装 DLL 之后

python - 将非常大的 RDF 三元组加载到 iGraph -> 快速顶点查找?

r - geom_text_repel 的控制颜色

data-structures - BFS和DFS的运行时间解释