igraph

2013-03-21 10 views
5

का उपयोग कर आर में कई अलग-अलग नेटवर्क खींचें मेरे पास दिशात्मक संबंधों (पैरेंट-> बच्चे) का एक साधारण सेट है जिसे मैं आकर्षित करना चाहता हूं। मेरा डेटा संरचित है कि कई अलग-अलग उप-नेटवर्क हैं। यहां कुछ नकली डेटा है जो मेरी तरह दिखता है।igraph

require(igraph) 
parents<-c("A","A","C","C","F","F","H","I") 
children<-c("B","C","D","E","G","H","I","J") 
begats<-data.frame(parents=parents,children=children) 
graph_begats<-graph.data.frame(begats) 
plot(graph_begats) 

फर्जी डेटा में दो अलग-अलग उप नेटवर्क हैं, जिनमें से प्रत्येक कड़ाई से माता-पिता-वंशावली है। मुझे एक ही खिड़की में पेड़ नेटवर्क के रूप में दोनों वंशों को आकर्षित करने की ज़रूरत है (आदर्श वही वर्टेक्स समन्वय प्रणाली)। मैंने layout.reingold.tilford() का उपयोग करने का प्रयास किया है, लेकिन सबसे अच्छा मैं ड्रॉ कर सकता हूं, पेड़ों में से एक है, इस तरह के रूट वर्टेक्स के शीर्ष पर मौजूद सभी अन्य शिखर सम्मेलन।

lo<-layout.reingold.tilford(graph_begats,root=1) 
plot(graph_begats,layout=lo) 

असीमित संख्याओं के मनमाना संख्या के लिए ऐसा करने के लिए कोई विचार?

+0

मैं यह पता लगाने सकता है कैसे ए) डेटासेट में असतत प्रजातियों की संख्या की गणना करने के लिए, और बी) अपने वंश के लिए प्रत्येक शीर्ष असाइन करते हैं, मैं एक के लिए रास्ता के 75% होगा मेरी समस्या का समाधान –

+1

'क्लस्टर() 'या' decompose.graph() 'का उपयोग करके नेटवर्क को अलग करें, फिर लेआउट मैट्रिस में से किसी एक को स्थानांतरित करके, प्रत्येक के लिए लेआउट की अलग-अलग गणना करें और फिर उन्हें मर्ज करें। –

+0

हां! 'decompose.graph()' मुझे जो चाहिए वह है। अभी भी मैट्रिक्स शिफ्ट पर काम कर रहा है, लेकिन मैं वहां जा रहा हूं। 'Layout.reingold.tilford()' का उपयोग करके पेड़ लेआउट को सही तरीके से प्राप्त करने के लिए –

उत्तर

6

इसलिए, जैसा कि मैंने ऊपर टिप्पणी में उल्लेख किया है, एक समाधान प्रत्येक घटक के लिए अलग से लेआउट की गणना करना है। यह काफी सरल है, यहां तक ​​कि इसे ठीक से करने के लिए कुछ कोड भी लेते हैं। नीचे दिए गए कोड को घटकों की मनमानी संख्या के लिए काम करना चाहिए। स्थलीय क्रम में पहला चरम प्रत्येक पेड़ के लिए रूट नोड के रूप में प्रयोग किया जाता है।

require(igraph) 

## Some data 
parents <- c("A", "A", "C", "C", "F", "F", "H", "I") 
children <- c("B", "C", "D", "E", "G", "H", "I", "J") 
begats <- data.frame(parents=parents, children=children) 
graph_begats <- graph.data.frame(begats) 

## Decompose the graph, individual layouts 
comp <- decompose.graph(graph_begats) 
roots <- sapply(lapply(comp, topological.sort), head, n=1) 
coords <- mapply(FUN=layout.reingold.tilford, comp, 
       root=roots, SIMPLIFY=FALSE) 

## Put the graphs side by side, roots on the top 
width <- sapply(coords, function(x) { r <- range(x[, 1]); r[2] - r[1] }) 
gap <- 0.5 
shift <- c(0, cumsum(width[-length(width)] + gap)) 
ncoords <- mapply(FUN=function(mat, shift) { 
    mat[,1] <- mat[,1] - min(mat[,1]) + shift 
    mat[,2] <- mat[,2] - max(mat[,2]) 
    mat 
}, coords, shift, SIMPLIFY=FALSE) 

## Put together the coordinates for the original graph, 
## based on the names of the vertices 
lay <- matrix(0, ncol=2, nrow=vcount(graph_begats)) 
for (i in seq_along(comp)) { 
    lay[match(V(comp[[i]])$name, V(graph_begats)$name),] <- ncoords[[i]] 
} 

## Plot everything 
par(mar=c(0,0,0,0)) 
plot(graph_begats, layout=lay) 

plot

+0

बहुत बहुत धन्यवाद, गैबर। यह बिल्कुल है! –

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