igraph
में, ग्राफ कम्युनिकेशंस खोजने के लिए मॉड्यूलरलाइजेशन एल्गोरिदम लागू करने के बाद, मैं एक नेटवर्क लेआउट तैयार करना चाहता हूं जो स्पष्ट रूप से विशिष्ट समुदायों और उनके कनेक्शन को दृश्यमान बनाता है। साइटोसस्केप में "समूह विशेषताओं का लेआउट" जैसा कुछ: मैं प्रत्येक समूह/समुदाय के सदस्यों को एक दूसरे के करीब दिखाना चाहता हूं, और समूहों/समुदायों के बीच कुछ दूरी रखना चाहता हूं। मुझे इस सुविधा को बॉक्स के बाहर प्रदान करने वाले igraph
में कोई फ़ंक्शन नहीं मिला। इस सवाल को पोस्ट करते समय मुझे पहले से ही एक साधारण डीआईआई समाधान मिला है, मैं इसे एक उत्तर के रूप में पोस्ट करने जा रहा हूं। लेकिन मैं सोच रहा हूं कि क्या कोई बेहतर संभावना है, या अधिक विस्तृत समाधान है?igraph में समूहीकृत लेआउट कैसे बनाएं?
उत्तर
गेबर के सुझाव पर विस्तार करने के लिए, मैं इस समारोह बनाया है किसी भी समुदाय का पता लगाने एल्गोरिथ्म के परिणाम से सदस्यता वेक्टर):
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)
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)
) का परिणाम है। इसका कारण यह है कि पहले मामले में, आपको नामों के साथ एक संख्यात्मक वेक्टर मिलता है (हम क्या चाहते हैं), और दूसरे मामले में, नाम के बिना वही वेक्टर।
एकाधिक समुदाय पहचान एल्गोरिदम की सर्वसम्मति प्राप्त करने के लिए, यह function देखें।
समारोह 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)
एक समाधान ग्राफ के किनारे वजन, 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)
}
बस अपने ग्राफ के किनारों का मैट्रिक्स की पंक्तियों पर इसे लागू (सदस्यता है:
हाय गैबर, क्या आप कृपया इस संबंधित [थ्रेड] (http://stackoverflow.com/questions/31432176/potential-issue-with-new-igraph-layout-algorithms-r) पर एक नज़र डालें। अग्रिम में धन्यवाद। – 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)
अंत में एक लेआउट कलन विधि 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")
मैं 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])
अब, अर्थ क्यों इस सवाल मौजूद हैं।
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)")
- 1. igraph फिक्स्ड नोड समन्वय लेआउट
- 2. igraph नोड्स
- 3. igraph
- 4. igraph
- 5. igraph
- 6. igraph
- 7. एंड्रॉइड/लेआउट: हेडर-सामग्री लेआउट कैसे बनाएं
- 8. Android 4.0 में टैबड लेआउट कैसे बनाएं?
- 9. एंड्रॉइड में विस्तारणीय पैनल लेआउट कैसे बनाएं?
- 10. एंड्रॉइड लेआउट में फिक्स्ड फ़ूटर कैसे बनाएं?
- 11. एंड्रॉइड में स्लाइड लेआउट एनीमेशन कैसे बनाएं?
- 12. समूहीकृत CheckboxSelectMultiple
- 13. iGraph ग्राफ़
- 14. आर igraph
- 15. आर igraph
- 16. पायथन-igraph
- 17. एचटीएमएल लेआउट व्हाइटस्पेस-अज्ञेयवादी कैसे बनाएं?
- 18. एंड्रॉइड: यह सरल लेआउट कैसे बनाएं?
- 19. एंड्रॉयड में लेआउट प्रोग्राम बनाएं - मुद्दा
- 20. एक समूहीकृत तालिका दृश्य
- 21. नेटवर्कक्स/igraph (पायथन)
- 22. आर igraph नाम बदलें
- 23. उत्कृष्ट पाठ 2 में कस्टम लेआउट कैसे बनाएं?
- 24. ऐप स्टोर में फीचर्ड पेज जैसे लेआउट कैसे बनाएं?
- 25. टूलबार को ग्रिड लेआउट बनाएं
- 26. समूहीकृत UITableView पंक्ति एनीमेशन
- 27. एक समूहीकृत संग्रह AutoMapper
- 28. एक निर्देशित पेड़ (igraph)
- 29. नेटवर्कक्स और igraph
- 30. कई समूहीकृत कैश कुंजी
अगर मैं अपने विधि का प्रयास मैं कोई त्रुटि मिलती है। मैंने नेटवर्क को अनुकरण करने के लिए आपके कोड के ऊपर केवल दो पंक्तियां जोड़ दी हैं, यानी, 'लाइब्रेरी (igraph); जी <- barabasi.game (100, निर्देशित = गलत) '। त्रुटि संदेश कहता है: 'जी $ लेआउट में त्रुटि [सी $ सदस्यता == सीसी,] <- एफ $ लेआउट: मैट्रिक्स' – majom
पर सबस्क्रिप्ट की गलत संख्या मुझे भी इसी तरह की त्रुटि मिल रही है। – imbenzene
क्षमा करें, ऐसा इसलिए होता है क्योंकि 'जी $ लेआउट' 'NULL' है। यदि आप इसे सही आयामों के साथ किसी भी मैट्रिक्स के साथ भरते हैं, या बस 'जी $ लेआउट <- layout.fruchterman.reingold (G)' के साथ भरते हैं, तो कोड अच्छी तरह से चलता है। – deeenes