13

ではigraph、モジュール化アルゴリズムを適用してグラフ コミュニティを見つけた後、個別のコミュニティとその接続を明確に可視化するネットワーク レイアウトを描きたいと思います。Cytoscapeの「グループ属性レイアウト」のようなもの:各グループ/コミュニティのメンバーを互いに近くに表示し、グループ/コミュニティ間にある程度の距離を保ちたい. igraphこの機能をすぐに提供できる機能が見つかりませんでした。この質問を投稿しているときに、私はすでに簡単な diy の解決策を見つけたので、回答として投稿します。しかし、より良い可能性、またはより精巧な解決策があるかどうか疑問に思っていますか?

4

4 に答える 4

8

Antoine の提案に触発されて、この関数を作成しました。

edge.weights <- function(community, network, weight.within = 100, weight.between = 1) {
bridges <- crossing(communities = community, graph = network)
weights <- ifelse(test = bridges, yes = weight.between, no = weight.within)
return(weights) 
}

関数は同じことを行います。コミュニティ オブジェクトをコミュニティ スロットに、グラフをネットワーク スロットに配置するだけです。をそのままにして、値weight.between = 1を調整しweight.withinます。

次に、重みをweightノードのスロットに転送します。

E(graph)$weight <- edge.weights(community, graph)

最後に ( inlayout_with_frの新しい名前) のような重みを使用するレイアウト アルゴリズムを使用します。fruchterman.reingoldigraph 1.0.1

例として、ザッカリーの空手クラブ ネットワークを使用します。

library(igraph)
library(igraphdata)
#I load the network
data(karate)
#for reproducible purposes
set.seed(23548723)
karateLayout <- layout_with_fr(karate)
par(mar = c(0,0,2,0))
plot(karate, vertex.size = 10, vertex.color = "steelblue4", edge.width = 1, 
vertex.label = NA, edge.color = "darkgrey", layout = karateLayout,
main = "Zachary's karate club network" )

ここに画像の説明を入力

cluster_louvain次の関数を使用して、モジュール性のマルチレベル最適化によってコミュニティを検出します。

Communitykarate <- cluster_louvain(karate)

次は、デフォルトよりも個人的な好みです。

prettyColors <- c("turquoise4", "azure4", "olivedrab","deeppink4")
communityColors <- prettyColors[membership(Communitykarate)]

コミュニティが色で強調表示されたグラフは次のとおりです。

plot(x = Communitykarate, y = karate, edge.width = 1, vertex.size = 10, 
vertex.label = NA, mark.groups = NULL, layout = karateLayout, col = communityColors,
main = "Communities in Zachary's karate club network",
edge.color = c("darkgrey","tomato2")crossing(Communitykarate, karate) + 1])

ここに画像の説明を入力

さて、なぜこの質問が存在するのかという意味。

E(karate)$weight <- edge.weights(Communitykarate, karate)
# I use the original layout as a base for the new one
karateLayoutA <- layout_with_fr(karate, karateLayout)
# the graph with the nodes grouped
plot(x = Communitykarate, y = karate, edge.width = 1, vertex.size = 10, 
mark.groups = NULL, layout = karateLayoutA, vertex.label = NA, col = communityColors, 
c("darkgrey","tomato2")[crossing(Communitykarate, karate) + 1],
main = "Communities in Zachary's karate club network (grouped)")

ここに画像の説明を入力

より多くの重量で試すと、次のようになります。

E(karate)$weight <- edge.weights(Communitykarate, karate, weight.within = 1000)
karateLayoutB <- layout_with_fr(karate, karateLayout)
plot(x = Communitykarate, y = karate, edge.width = 1, vertex.size = 10,
 mark.groups = NULL, layout = karateLayoutB, vertex.label = NA, col = communityColors, 
c("darkgrey","tomato2")[crossing(Communitykarate, karate) + 1],
main = "Communities in Zachary's karate club network (grouped)")

ここに画像の説明を入力

于 2015-08-12T22:17:38.450 に答える
7

ガボールの提案を拡張するために、次の関数を作成しました。

weight.community=function(row,membership,weigth.within,weight.between){
if(as.numeric(membership[which(names(membership)==row[1])])==as.numeric(membership[which(names(membership)==row[2])])){
weight=weigth.within
}else{
weight=weight.between
}
return(weight)
}

グラフのエッジのマトリックスの行に適用するだけですget.edgelist(your_graph))(新しいエッジの重みを設定するために与えられます (メンバーシップは、任意のコミュニティ検出アルゴリズムの結果からのメンバーシップ ベクトルです)。

E(g)$weight=apply(get.edgelist(g),1,weight.community,membership,10,1)

次に、Gabor が提案する fruchterman.reingold などのエッジの重みを受け入れるレイアウト アルゴリズムを使用します。weights 引数を微調整して、必要なグラフを取得できます。例えば:

E(g)$weight=apply(get.edgelist(g),1,weight.community,membership,10,1)
g$layout=layout.fruchterman.reingold(g,weights=E(g)$weight)
plot(g)

ここに画像の説明を入力

E(g)$weight=apply(get.edgelist(g),1,weight.community,membership,1000,1)
g$layout=layout.fruchterman.reingold(g,weights=E(g)$weight)
plot(g)

ここに画像の説明を入力

注 1: エッジの透明度/色は、私のグラフの他のパラメーターです。実際に機能することを示すために、コミュニティごとにノードに色を付けました。

注 2: を使用し、 を使用membership(comm)しないcomm$membershipでください。ここcommで、 はコミュニティ検出アルゴリズムの結果です (例: comm=leading.eigenvector.community(g))。その理由は、最初のケースでは名前付きの数値ベクトル (必要なもの) が得られ、2 番目のケースでは名前のない同じベクトルが得られるためです。

複数のコミュニティ検出アルゴリズムのコンセンサスを取得するには、この関数を参照してください。

于 2015-03-17T12:21:35.880 に答える
3

この関数layout.modularは、igraph コミュニティ検出方法の結果から、グラフのグループ化されたレイアウトを提供します。

c <- fastgreedy.community(G)

layout.modular <- function(G,c){
nm <- length(levels(as.factor(c$membership)))
gr <- 2
while(gr^2<nm){
    gr <- gr+1
}
i <- j <- 0
for(cc in levels(as.factor(c$membership))){
    F <- delete.vertices(G,c$membership!=cc)
    F$layout <- layout.kamada.kawai(F)
    F$layout <- layout.norm(F$layout, i,i+0.5,j,j+0.5)
    G$layout[c$membership==cc,] <- F$layout
    if(i==gr){
        i <- 0
        if(j==gr){
            j <- 0
        }else{
            j <- j+1
        }
    }else{
        i <- i+1
    }
}
return(G$layout)
}

G$layout <- layout.modular(G,c)
V(G)$color <- rainbow(length(levels(as.factor(c$membership))))[c$membership]
plot(G)
于 2013-05-05T23:34:23.680 に答える