आर

2012-11-28 10 views
5

में एक निर्देशित ग्राफ पढ़ें मुझे निर्देशित ग्राफ पढ़ने/बनाने में परेशानी है। मैंने उन चरणों का पालन किया जो मुझे here मिला है।आर

यह मेरा पाठ फ़ाइल graph.txt है:

1 2 
1 3 
2 5 
3 4 
3 5 
4 5 
5 6 
5 10 
6 7 
7 8 
7 9 
7 12 
8 9 
9 10 
9 11 
9 12 
10 11 
11 7 
11 12 

अब मैं इस graph.txt पढ़ें:

library("igraph") 
xlist<-read.graph("graph.txt", format="edgelist") 

और फिर मैं यह साजिश:

plot(xlist) 

लेकिन यह ग्राफ नहीं है जो मेरे पास है xlist में ead:

http://i.imgur.com/dubQh.png

कि आप देख सकते 1-> 2 बीच कोई बढ़त नहीं है, 1-> 3, 5-> 10 और इसी तरह। मैं निर्देशित ग्राफ को सही तरीके से कैसे पढ़ सकता हूं?

ऐसा करने के बाद, मैं दो नोड्स के बीच सभी सबसे छोटे पथ कैसे दिखा सकता हूं?

उत्तर

6

यह मेरे लिए ठीक काम करने के लिए लगता है:

xlist<-read.table("graph.txt") 
xlist <- graph.data.frame(xlist) 
plot(xlist) 

नोट R नोड्स और सूचियों को उन लोगों से शून्य से ऊपर की तरफ नहीं है (जैसा कि नीचे @Sacha Epskamp टिप्पणी हाल ही में igraph अद्यतन में) बदल जाता है। का उपयोग करना:

plot(xlist, vertex.label= V(xlist)$name) 

आप ऐसे नाम हैं जो आप चाहते हैं देखेंगे। i.e. किनारों के बीच 1 और 2.

सबसे कम पथों को साकार करने का एक तरीका get.all.shortest.paths का उपयोग करना है और फिर इसका उपयोग अपने ग्राफ को सब्सक्राइब करने और इसे ओवरप्लॉट करने के लिए करें। इसी उदाहरण के लिए मेरा answer to this question देखें जहां मैं एक स्पैनिंग पेड़ लगाता हूं।

+0

"नोट आर नोड्स को बदलता है और उन्हें शून्य से ऊपर अनुक्रमणित करता है" यह हाल ही में 'igraph' अद्यतन में बदल दिया गया है। –

+0

@SachaEpskamp ठंडा मुझे यह एहसास नहीं हुआ। –

5

त्रुटि का कारण यह है कि किनारे की सूची फ़ाइलें (यानी "edgelist" प्रारूप) शून्य से शिखर संख्या। यह सभी igraph संस्करणों में समान है, भले ही हालिया आर igraph संकुल एक से शिखर सम्मेलन संख्या।

इसका कारण यह है कि हम आर igraph को पाइथन इग्राफ और सी इग्राफ के साथ संगत होने के लिए चाहते हैं, जहां तक ​​फ़ाइल स्वरूपों को जाना है। अर्थात। पाइथन इग्राफ द्वारा लिखी गई एक फ़ाइल (इस मामले में एक एज सूची फ़ाइल) को आर इग्राफ और पायथन इग्राफ द्वारा उसी तरह व्याख्या किया जाता है। शून्य-आधारित नंबरिंग फ़ाइल प्रारूप की एक संपत्ति है।

यदि आपके पास पहले से किनारे की सूची फ़ाइल है जो एक के साथ कोष्ठक को नंबर करना शुरू कर देती है, तो यह igraph edgelist फ़ाइल प्रारूप नहीं है, और आपको प्रत्येक वर्टेक्स आईडी से केवल एक को घटाकर इसे परिवर्तित करने की आवश्यकता है।

का संभावित हल (scan() बहुत तेजी से है, तो आप बड़ी फ़ाइलों को अगर महत्वपूर्ण हो सकता है जो) scan() या read.table() साथ फ़ाइल में पढ़ने के लिए, और फिर graph() सीधे कॉल है। इस मामले में आपको एक को घटाने की आवश्यकता नहीं है, क्योंकि आर igraph vertex आईडी में से एक को गिने जाते हैं।