如何在 R 中注释距离矩阵到最小生成树边缘的距离?

问题描述 投票:0回答:1

大家好!

我正在尝试使用 ggplot 创建最小生成树,因为我想利用 ggplot2,尤其是 ggnetwork 函数(如 geom_edgelabel() )来接收复杂的、可修改的树图。我无法完成的是注释从最小生成树下的距离矩阵到边缘的距离值。

首先,我有基于包含整数的矩阵的距离矩阵。

set.seed(1)
matrix <- matrix(sample(1:20, 10 * 20, replace = TRUE), nrow = 10, ncol = 20)
dist <- dist(matrix)

然后我将距离矩阵输入 ape::mst() 函数以获得最小生成树。

if (!require(ape))
  install.packages('ape')
library(ape)

ape_mst <- ape::mst(dist)

为了将生成的

mst
对象转换为 ggplot() 接受的格式,我将其传递给 igraph::graph.adjacency() 以获取包含边缘信息的
igraph
对象。

if (!require(igraph))
  install.packages('igraph')
library(igraph)

gr_adj <- graph.adjacency(ape_mst, "undirected")

作为最后一步,我使用 ggnetwork 包中的 ggnetwork() 来获取数据框,我最终可以将其移交给 ggplot() 并接收我的树。

if (!require(ggnetwork))
  install.packages('ggnetwork')
library(ggnetwork)

gg <- ggnetwork(gr_adj, arrow.gap = 0, layout = layout_with_fr(gr_adj))

ggplot(gg, aes(x = x, y = y, xend = xend, yend = yend)) + geom_edges() + geom_nodelabel(aes(label = name)) + geom_edgelabel(aes(label = name), size = 2)

不幸的是,数据框不保存任何边缘信息,所以我无法注释,例如我想要的距离。使用包

Claddis
,我可以轻松地检索给定距离矩阵的最小生成树的每个边对应的距离,但由于我事先创建的对象的结构,我无法对它们进行注释。

if (!require(Claddis))
  install.packages('Claddis')
library(Claddis)

find_minimum_spanning_edges(dist)

如果有人对如何解决这个问题提出建议,我会很高兴!

r annotations visualization minimum-spanning-tree ape
1个回答
0
投票

您可以在

igraph
ggraph

中完成所有这些操作
library(igraph)
library(ggraph)

set.seed(1)

matrix(sample(1:20, 10 * 20, replace = TRUE), nrow = 10, ncol = 20) |>
  dist() |>
  as.matrix() |>
  graph.adjacency(weighted = TRUE) |>
  mst() |>
  ggraph(layout = "igraph", algorithm = "nicely") +
  geom_edge_link(aes(width = weight, label = round(weight, 1)),
                 angle_calc = "along", vjust = -0.5) +
  geom_node_point(size = 10, fill = "white", shape = 21) +
  geom_node_text(aes(label = name)) +
  scale_edge_width_continuous(range = c(0.5, 1.5), guide = "none") +
  theme_graph()

© www.soinside.com 2019 - 2024. All rights reserved.