2011-03-19 15 views
24

मैं प्रवाह आरेख जैसा दिखने के लिए नेटवर्क विज़ुअलाइजेशन खींचने की कोशिश कर रहा हूं। मैं काफी निम्न कोड के साथ निकट हूँ, लेकिन मैं कुछ सवाल है:फिक्स्ड पोजिशन के साथ igraph प्लॉट लेआउट को कैसे नियंत्रित करें?

  1. यह सबसे अच्छा लेआउट() कलन विधि है, या मैं मैन्युअल रूप से प्रत्येक नोड>
  2. मैं कैसे कर सकते हैं के लिए एक स्थान प्रदान कर सकते हैं सुनिश्चित करें कि ये नोड्स साजिश में ओवरलैप नहीं होते हैं (जैसा कि वे यहां करते हैं)?
  3. क्या मैं एक नोड को "एंकर" या शुरुआती बिंदु के रूप में असाइन कर सकता हूं? यानी, क्या मैं "सी" को सबसे ज्यादा या बाएं-सबसे नोड बना सकता हूं?

बहुत बहुत धन्यवाद !!

library("igraph") 
L3 <- LETTERS[1:8] 
d <- data.frame(start = sample(L3, 16, replace = T), end = sample(L3, 16, replace = T), 
       weight = c(20,40,20,30,50,60,20,30,20,40,20,30,50,60,20,30)) 


g <- graph.data.frame(d, directed = T) 

V(g)$name 
E(g)$weight 

ideg <- degree(g, mode = "in", loops = F) 

col=rainbow(12) # For edge colors 

plot.igraph(g, 
    vertex.label = V(g)$name, vertex.label.color = "gray20", 
    vertex.size = ideg*25 + 40, vertex.size2 = 30, 
    vertex.color = "gray90", vertex.frame.color = "gray20", 
    vertex.shape = "rectangle", 
    edge.arrow.size=0.5, edge.color=col, edge.width = E(g)$weight/10, 
    edge.curved = T, 
    layout = layout.reingold.tilford) 

उत्तर

32

igraph में लेआउट को 2 कॉलम और प्रत्येक नोड के लिए एक पंक्ति के साथ एक मैट्रिक्स में परिभाषित किया गया है। पहला कॉलम इसकी एक्स स्थिति इंगित करता है और दूसरा इसकी वाई स्थिति इंगित करता है, और स्केल प्रासंगिक नहीं है (इसे हमेशा -1 से 1 प्लॉटिंग क्षेत्र में फिट करने के लिए पुन: सहेजा जाता है। आप ग्राफ पर लेआउट फ़ंक्शन को कॉल करके प्लॉट करने से पहले यह लेआउट प्राप्त कर सकते हैं :

l <-layout.reingold.tilford(g) 
l 
    [,1] [,2] 
[1,] 0 0 
[2,] -1 3 
[3,] 0 1 
[4,] 0 3 
[5,] 0 2 
[6,] 0 4 
[7,] 1 3 

इस तरह से आप आप मैन्युअल रूप से चाहते हैं किसी भी तरह से इसे बदल सकते हैं, और उसके बाद भूखंड पर भेज दें:

plot.igraph(g, 
    vertex.label = V(g)$name, vertex.label.color = "gray20", 
    vertex.size = ideg*25 + 40, vertex.size2 = 30, 
    vertex.color = "gray90", vertex.frame.color = "gray20", 
    vertex.shape = "rectangle", 
    edge.arrow.size=0.5, edge.color=col, edge.width = E(g)$weight/10, 
    edge.curved = T, 
    layout = l) 

यह भी लगता है कि आप लेआउट को नियंत्रित करने के तर्क params सेट कर सकते हैं कि abit। यह एक सूची है जिसमें एक तर्क root है जो स्पष्ट रूप से ग्राफ की जड़ को सेट करने के लिए उपयोग किया जा सकता है। इसे कई असाइन करें नोड (याद रखें कि igraph नोड्स के लिए इंडेक्स की तरह सी का उपयोग करता है, पहला वाला 0 है)। तो 'सी' पर रूट की स्थापना:

l <- layout.reingold.tilford(g,params=list(root=2)) 

संपादित करें: इसके अलावा RGraphViz कि बाहर की जाँच के लायक हो सकता है इसमें कुछ अच्छा पेड़ लेआउट है।


संपादित करें 2:

यह मेरा पैकेज है, जो एक ग्राफ में नोड्स के स्थान को परिभाषित करने के लेआउट मैट्रिक्स की एक ही तरह का उपयोग करता है, जो आपके लिए उपयोगी हो सकता है कि से स्रोत कोड की एक संशोधित स्निपेट है:

gridLayout <- function(x) 
{ 
    LmatX <- seq(-1,1,length=ncol(x)) 
    LmatY <- seq(1,-1,length=nrow(x)) 

    loc <- t(sapply(1:max(x),function(y)which(x==y,arr.ind=T))) 
    layout <- cbind(LmatX[loc[,2]],LmatY[loc[,1]]) 
    return(layout) 
} 

क्या इस समारोह करता है x और y पदों के साथ एक दो कॉलम लेआउट के लिए एक मैट्रिक्स एक ग्रिड (layout() के समान) में लेआउट को निर्दिष्ट बदलना है। शून्य के मैट्रिक्स को परिभाषित करें और प्रत्येक नोड पूर्णांक के लिए 1 से नोड्स की कुल संख्या (यह igraph ID + 1 है) को परिभाषित करें।

उदाहरण के लिए

, एक मूर्खतापूर्ण 4 नोड ग्राफ के लिए:

grid <- matrix(c(
    0,0,1,0,0, 
    2,0,3,0,4),nrow=2,byrow=TRUE) 

library("igraph") 

g <- graph.adjacency(matrix(1,4,4)) 

plot(g,layout=gridLayout(L)) 
+0

सुझावों के लिए धन्यवाद! इस तरह की स्थिति को सेट करना, इसे सभी को एक साथ रखें: l2 <- as.matrix (data.frame (c (0,6,12,12,12,24,24,24), c (0, .5, - 5 , 0, -1,1, -1 ,.25))) –

+3

2 साल बाद यह उत्तर मेरे लिए उपयोगी था :-) –

+1

सच्चा, जब मैं आपका कोड लागू करता हूं, तो मुझे 'एनकॉल में त्रुटि (एक्स): ऑब्जेक्ट' एल 'नहीं मिला'। लाइन 'प्लॉट में (जी, लेआउट = ग्रिडलाउट (एल))' एक समस्या हो सकती है जिसे मैं समझ नहीं पाया। –

4

ऊपर से एक कम जटिल विधि यदि आप के साथ अपने डेटापत्रक में लेबल x और y स्तंभ जोड़ने नोड स्थानों खुद है प्रदान करना चाहते हैं एक्स और वाई उन स्तंभों में संबंधित नोड्स के लिए निर्देशांक। जैसे

library('igraph') 
nodes <- c('a','b','c','d') 
x <- c(0,1,2,3) 
y <- c(0,1,2,3) 
from <- c('a','b','c') 
to <- c('b','c','d') 
NodeList <- data.frame(nodes, x ,y) 
EdgeList <- data.frame(from, to) 
a<- graph_from_data_frame(vertices = NodeList, d= EdgeList, directed = FALSE) 
plot(a) 

enter image description here

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