在 igraph r 中对顶点进行排序并向组添加颜色

Sorting vertex and adding colors to groups in igraph r

我有一个可能非常简单的问题。我有一组 6 人之间的距离矩阵 MD(请参见下面的示例)。它们分为三组:

ClassA <- c("TOM","EVE","STEVE")
ClassB <- c("JANE","HANNAH")
ClassC <- c("ADAM")

矩阵:

           TOM        JANE     ADAM      EVE      STEVE    HANNAH  
 TOM     0.0000000 0.8383965 1.1979821 1.186857 1.3500972 1.125554 
 JANE    0.8383965 0.0000000 1.2319391 1.274157 1.3964041 1.623064 
 ADAM    1.1979821 1.2319391 0.0000000 1.278604 0.8377628 1.432721 
 EVE     1.1868572 1.2741569 1.2786041 0.000000 1.4310217 1.328200 
 STEVE   1.3500972 1.3964041 0.8377628 1.431022 0.0000000 1.465991 
 HANNAH  1.1255540 1.6230643 1.4327214 1.328200 1.4659912 0.000000 

现在我想绘制一个最小生成树:

g <- graph.adjacency(as.matrix(MD), weighted=TRUE)
V(g)$label <- V(g)$name 
mst <- as.undirected(minimum.spanning.tree(g)) 

我的问题是:如何给属于同一组的顶点添加指定的颜色?示例中很简单,

V(g)[1]$color <- "red"
V(g)[2]$color <- "blue"
V(g)[3]$color <- "green"

但是,整个矩阵有 100 多个学生,因此我需要更高效的方法。我试图对它进行排序,但是我的函数崩溃了。

谢谢 MrFlick!这真的很简单但很有效。您可能知道如何在 rglplot 中添加图例吗?我使用它是因为 mst 图在 rgl 中看起来比在绘图中更好,但它的主要目的是 3D 图,不幸的是我没有找到任何信息如何将图例添加到 2D 图。

> library(rgl)

> rgl.open()

> rgl.bg(sphere=FALSE, color=c("white"), lit=FALSE)

> rglplot(mst,vertex.size = 3, layout = myLayout, vertex.label.font=10, vertex.label.dist=0.2) 

首先,如果您的 name/class 作业放在 data.frame 中会更好。 (如果它们存储在列表或其他东西中也会很好)。在这里,我将所有 ClassA/B/C/* 变量收集到一个列表中并将它们堆叠起来

indclass <- stack(mget(ls(pattern="Class*")))
indclass
#   values    ind
# 1    TOM ClassA
# 2    EVE ClassA
# 3  STEVE ClassA
# 4   JANE ClassB
# 5 HANNAH ClassB
# 6   ADAM ClassC

我将为每个 class 名称选择颜色(上面 "ind" 列中的值)

cols <- c(ClassA="green", ClassB="lightblue", ClassC="purple")

然后,我将使用 match() 查找每个顶点的 class 并根据 class 名称

分配颜色
V(g)$color <- cols[ indclass$ind[match( V(mst)$name, indclass$values ) ] ]

然后如果你绘制你的最小生成树,你会得到

mst <- as.undirected(minimum.spanning.tree(g)) 
plot(mst)