大家好!
我正在尝试使用 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)
如果有人对如何解决这个问题提出建议,我会很高兴!
您可以在
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()