2013-05-05 5 views
13

igraph में, ग्राफ कम्युनिकेशंस खोजने के लिए मॉड्यूलरलाइजेशन एल्गोरिदम लागू करने के बाद, मैं एक नेटवर्क लेआउट तैयार करना चाहता हूं जो स्पष्ट रूप से विशिष्ट समुदायों और उनके कनेक्शन को दृश्यमान बनाता है। साइटोसस्केप में "समूह विशेषताओं का लेआउट" जैसा कुछ: मैं प्रत्येक समूह/समुदाय के सदस्यों को एक दूसरे के करीब दिखाना चाहता हूं, और समूहों/समुदायों के बीच कुछ दूरी रखना चाहता हूं। मुझे इस सुविधा को बॉक्स के बाहर प्रदान करने वाले igraph में कोई फ़ंक्शन नहीं मिला। इस सवाल को पोस्ट करते समय मुझे पहले से ही एक साधारण डीआईआई समाधान मिला है, मैं इसे एक उत्तर के रूप में पोस्ट करने जा रहा हूं। लेकिन मैं सोच रहा हूं कि क्या कोई बेहतर संभावना है, या अधिक विस्तृत समाधान है?igraph में समूहीकृत लेआउट कैसे बनाएं?

उत्तर

4

गेबर के सुझाव पर विस्तार करने के लिए, मैं इस समारोह बनाया है किसी भी समुदाय का पता लगाने एल्गोरिथ्म के परिणाम से सदस्यता वेक्टर):

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

फिर, बस एक लेआउट एल्गोरिथ्म है कि इस तरह के रूप में fruchterman.reingold बढ़त वजन के रूप में गेबर ने सुझाव दिया स्वीकार करता है का उपयोग आप ओबी के वजन तर्क ठीक कर सकते हैं। इच्छित ग्राफ को टैन करें।

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) 

enter image description here

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) 

enter image description here

नोट 1: उदाहरण के लिए पारदर्शिता/किनारों के रंग मेरे रेखांकन के अन्य मानकों हैं। मेरे पास समुदाय द्वारा रंगीन नोड्स दिखाते हैं कि यह वास्तव में काम करता है।

नोट 2: membership(comm) और नहीं comm$membership, जहां comm का उपयोग सुनिश्चित करें समुदाय का पता लगाने एल्गोरिथ्म (जैसे, comm=leading.eigenvector.community(g)) का परिणाम है। इसका कारण यह है कि पहले मामले में, आपको नामों के साथ एक संख्यात्मक वेक्टर मिलता है (हम क्या चाहते हैं), और दूसरे मामले में, नाम के बिना वही वेक्टर।

एकाधिक समुदाय पहचान एल्गोरिदम की सर्वसम्मति प्राप्त करने के लिए, यह function देखें।

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) 
+1

अगर मैं अपने विधि का प्रयास मैं कोई त्रुटि मिलती है। मैंने नेटवर्क को अनुकरण करने के लिए आपके कोड के ऊपर केवल दो पंक्तियां जोड़ दी हैं, यानी, 'लाइब्रेरी (igraph); जी <- barabasi.game (100, निर्देशित = गलत) '। त्रुटि संदेश कहता है: 'जी $ लेआउट में त्रुटि [सी $ सदस्यता == सीसी,] <- एफ $ लेआउट: मैट्रिक्स' – majom

+0

पर सबस्क्रिप्ट की गलत संख्या मुझे भी इसी तरह की त्रुटि मिल रही है। – imbenzene

+0

क्षमा करें, ऐसा इसलिए होता है क्योंकि 'जी $ लेआउट' 'NULL' है। यदि आप इसे सही आयामों के साथ किसी भी मैट्रिक्स के साथ भरते हैं, या बस 'जी $ लेआउट <- layout.fruchterman.reingold (G)' के साथ भरते हैं, तो कोड अच्छी तरह से चलता है। – deeenes

2

एक समाधान ग्राफ के किनारे वजन, modularization के आधार पर स्थापित करने के लिए किया जाएगा। भीतर के मॉड्यूल किनारों को कुछ बड़े वजन में सेट करें, और मॉड्यूल किनारों के बीच कुछ छोटे वजन के लिए सेट करें। फिर layout.fruchterman.reingold() पर कॉल करें, या किनारे के वजन का समर्थन करने वाले किसी भी एल्गोरिदम को कॉल करें।

आपको वास्तविक वजन मानों के साथ थोड़ा सा खेलना पड़ सकता है, क्योंकि यह आपके ग्राफ पर निर्भर करता है। (get.edgelist(your_graph)) द्वारा दिए गए नए बढ़त वजन सेट करने के लिए

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) 
} 

बस अपने ग्राफ के किनारों का मैट्रिक्स की पंक्तियों पर इसे लागू (सदस्यता है:

+0

हाय गैबर, क्या आप कृपया इस संबंधित [थ्रेड] (http://stackoverflow.com/questions/31432176/potential-issue-with-new-igraph-layout-algorithms-r) पर एक नज़र डालें। अग्रिम में धन्यवाद। – Antoine

5

एंटोनी के सुझाव पर प्रेरित होकर, मैं इस समारोह बनाया:

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) 

अंत में एक लेआउट कलन विधि layout_with_fr (नई igraph 1.0.1 में fruchterman.reingold का नाम) की तरह वजन का उपयोग करता है का उपयोग करें।

उदाहरण के तौर पर मैं जॅचरी के कराटे क्लब नेटवर्क का उपयोग करता हूं।

Communitykarate <- cluster_louvain(karate) 

अगले यह चूक पर एक निजी पसंद है::

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

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") 

enter image description here

मैं cluster_louvain समारोह के साथ प्रतिरूपकता की बहु स्तरीय अनुकूलन द्वारा समुदायों का पता लगाने के

समुदायों के साथ ग्राफ रंगों का उपयोग हाइलाइट किया गया है:

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]) 

enter image description here

अब, अर्थ क्यों इस सवाल मौजूद हैं।

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)") 

enter image description here

आप और अधिक वजन के साथ की कोशिश आप होगा है:

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)") 

enter image description here

संबंधित मुद्दे