2015-06-06 34 views
4

我有一个类似于d的data.frame,如下所示。按属性对网络节点进行聚类

d <- structure(list(ID = c("KP1009", "GP3040", "KP1757", "GP2243", 
          "KP682", "KP1789", "KP1933", "KP1662", "KP1718", "GP3339", "GP4007", 
          "GP3398", "GP6720", "KP808", "KP1154", "KP748", "GP4263", "GP1132", 
          "GP5881", "GP6291", "KP1004", "KP1998", "GP4123", "GP5930", "KP1070", 
          "KP905", "KP579", "KP1100", "KP587", "GP913", "GP4864", "KP1513", 
          "GP5979", "KP730", "KP1412", "KP615", "KP1315", "KP993", "GP1521", 
          "KP1034", "KP651", "GP2876", "GP4715", "GP5056", "GP555", "GP408", 
          "GP4217", "GP641"), 
        Type = c("B", "A", "B", "A", "B", "B", "B", 
          "B", "B", "A", "A", "A", "A", "B", "B", "B", "A", "A", "A", "A", 
          "B", "B", "A", "A", "B", "B", "B", "B", "B", "A", "A", "B", "A", 
          "B", "B", "B", "B", "B", "A", "B", "B", "A", "A", "A", "A", "A", 
          "A", "A"), 
        Set = c(15L, 1L, 10L, 21L, 5L, 9L, 12L, 15L, 16L, 
          19L, 22L, 3L, 12L, 22L, 15L, 25L, 10L, 25L, 12L, 3L, 10L, 8L, 
          8L, 20L, 20L, 19L, 25L, 15L, 6L, 21L, 9L, 5L, 24L, 9L, 20L, 5L, 
          2L, 2L, 11L, 9L, 16L, 10L, 21L, 4L, 1L, 8L, 5L, 11L), Loc = c(3L, 
          2L, 3L, 1L, 3L, 3L, 3L, 1L, 2L, 1L, 3L, 1L, 1L, 2L, 2L, 1L, 3L, 
          2L, 2L, 2L, 3L, 2L, 3L, 2L, 1L, 3L, 3L, 3L, 2L, 3L, 1L, 3L, 3L, 
          1L, 3L, 2L, 3L, 1L, 1L, 1L, 2L, 3L, 3L, 3L, 2L, 2L, 3L, 3L)), 
       .Names = c("ID", "Type", "Set", "Loc"), class = "data.frame", 
       row.names = c(NA, -48L)) 

我试图想象套在data.frame(d$Sets)作为网络图。

sets <- unique(d$Set[duplicated(d$Set)]) 
rel <- vector("list", length(sets)) 
for (i in 1:length(sets)) { 
    rel[[i]] <- as.data.frame(t(combn(subset(d, d$Set ==sets[i])$ID, 2))) 
} 
library(data.table) 
rel <- rbindlist(rel) 

library(igraph) 
g <- graph.data.frame(rel, directed=F, vertices=d) 

V(g)$color = ifelse(V(g)$Type == "A", "red", "green") 

layout <- layout.fruchterman.reingold(g, niter = 500) 

plot.igraph(g, vertex.size=8, 
      vertex.label.cex=0.9, layout = layout) 

我有彩色的基础上V(g)$Typed$Type节点。

enter image description here

现在,在最后的情节,所有种类的集撞在了一起。我想把这些集合作为一个单独的组合来绘制,这样最后会有三组集合。

  1. 设置与类型的成员一个
  2. 集B型的成员
  3. 设置A型的成员和B

像这样的事情enter image description here

如何实现这一目标使用igraph软件包进行群集分类?

+0

我认为你缺少你定义'麻烦布局“,这可能是'layout.fruchterman.reingold'与一些非默认参数。此外,您似乎已经以某种方式绘制了群集,您用什么来制作最终图像? – hrbrmstr

+0

@hrbrmstr是布局是'layout.fruchterman.reingold'。现在用它更新了代码。 – Crops

+0

@hrbrmstr最后一张图片不是用'igraph'生成的。这是我最终想要的。所以我通过编辑图像编辑软件中的第一个来创建最后一个,以澄清所需的结果。 – Crops

回答

3

下面是我解决它的方法,使用上面的代码创建g对象。这是不是在因为在组/连通/集群级别多色会员的第一眼,你想达到:

## Find cluster membership: 
c <- clusters(g) 
d <- data.frame(membership=c$membership, color=V(g)$color, id=1:length(V(g))) 
c$red_members <- aggregate(d$color=="red", by=list(d$membership), FUN=sum)[,2] 
c$green_members <- aggregate(d$color=="green", by=list(d$membership), FUN=sum)[,2] 
V(g)$group_has_red <- (c$red_members[ c$membership ] > 0) 
V(g)$group_has_green <- (c$green_members[ c$membership ] > 0) 


## Create sub-graphs containing the appropriate membership: 
g_mixed <- delete.vertices(g, !(V(g)$group_has_red & V(g)$group_has_green)) 
g_red <- delete.vertices(g, !(V(g)$group_has_red & !(V(g)$group_has_green))) 
g_green <- delete.vertices(g, !(V(g)$group_has_green & !(V(g)$group_has_red))) 

par(mfrow=c(1,3)) 
plot(g_green, vertex.size=8, vertex.label=NA) 
plot(g_mixed, vertex.size=8, vertex.label=NA) 
plot(g_red, vertex.size=8, vertex.label=NA) 

enter image description here