2011-09-22 8 views
16

मुझे आर का उपयोग करके 5 नोड्स और 20 निर्देशित किनारों (प्रत्येक 2 नोड्स को जोड़ने वाला किनारा) के साथ नेटवर्क खींचने की आवश्यकता है, लेकिन मुझे मौजूद होने के लिए दो विशेषताएं चाहिए:आर में नियंत्रण नेटवर्क (नियंत्रण किनार मोटाई प्लस गैर-ओवरलैपिंग किनारों)

  1. प्रत्येक किनारे की मोटाई को नियंत्रित करने में सक्षम होने के लिए।
  2. किनारों नहीं व्याप्ति हो जा (यानी, बी के किनारे प्रपत्र एक एक करने के लिए बी से किनारे पर नहीं बनाया गया है)

मैं घंटे खर्च किया है एक समाधान के लिए देख रहा है, और कई संकुल की कोशिश की, लेकिन हमेशा एक समस्या है।

क्या कोई भी समाधान का सुझाव दे सकता है और संभव के रूप में एक पूर्ण उदाहरण प्रदान कर सकता है?

अग्रिम में बहुत धन्यवाद।

उत्तर

23

यदि लाइनों को घुमाने के लिए ठीक है तो मुझे दो तरीकों से पता है। सबसे पहले मैं एक edgelist बनाएँ:

Edges <- data.frame(
    from = rep(1:5,each=5), 
    to = rep(1:5,times=5), 
    thickness = abs(rnorm(25))) 

Edges <- subset(Edges,from!=to) 

यह दूसरे और तीसरे पर वजन में प्रथम स्तंभ में मूल के नोड, गंतव्य के नोड में शामिल है। आप इसका उपयोग करके एक भारित ग्राफ प्लॉट करने के लिए मेरे पैकेक qgraph का उपयोग कर सकते हैं। डिफ़ॉल्ट रूप से किनारों घुमावदार रहे हैं अगर वहाँ दो नोड्स के बीच कई किनारों हैं:

library("qgraph") 
qgraph(Edges,esize=5,gray=TRUE) 

qgraph

हालांकि इस पैकेज वास्तव में इस उद्देश्य के लिए इरादा नहीं है और आप किनारे रंग नहीं बदल सकते (अभी तक, काम इस पर:))। आप केवल एक छोटा सा चाल के साथ काले रंग सभी किनारों बना सकते हैं:

qgraph(Edges,esize=5,gray=TRUE,minimum=0,cut=.Machine$double.xmin) 

अधिक नियंत्रण के लिए आप igraph पैकेज का उपयोग कर सकते हैं। पहले हम ग्राफ बनाना:

library("igraph") 
g <- graph.edgelist(as.matrix(Edges[,-3])) 

नोट मैट्रिक्स रूपांतरण और एक घटाकर क्योंकि प्रथम नोड 0 है।अगला हम लेआउट को परिभाषित:

l <- layout.fruchterman.reingold(g) 

अब हम E() समारोह के साथ किनारे कुछ पैरामीटर बदल सकते हैं:

# Define edge widths: 
E(g)$width <- Edges$thickness * 5 

# Define arrow widths: 
E(g)$arrow.width <- Edges$thickness * 5 

# Make edges curved: 
E(g)$curved <- 0.2 

और अंत में लेखाचित्र:

plot(g,layout=l) 

igraph

+0

बहुत बहुत धन्यवाद, 2 समाधान काम कर रहे हैं। लेकिन अब मुझे एक और समस्या मिली; मैं एक ही नोड नामों के साथ 2 नेटवर्क खींच रहा हूं लेकिन विभिन्न किनारों की मोटाई के साथ, प्रत्येक नेटवर्क में एक ही नोड का अलग-अलग स्थान होता है, उदाहरण के लिए, पहले नेटवर्क में नोड 1 ऊपर बाईं ओर खींचा जाता है और दूसरे नेटवर्क में शीर्ष पर खींचा जाता है सही। मुझे नोड्स को एक ही स्थान पर होने की आवश्यकता है, इसलिए 2 नेटवर्क के बीच दृष्टि से तुलना करना आसान है। क्या आप इसे ठीक करने का कोई तरीका जानते हैं? धन्यवाद – Pansy

+0

आप निश्चित लेआउट का उपयोग कर नोड्स के प्लेसमेंट को मैन्युअल रूप से परिभाषित कर सकते हैं। Qgraph में इसे निम्नानुसार किया जा सकता है: एक ग्राफ़ के लेआउट को 'एल <- qgraph ([arguments]) $ लेआउट' के साथ स्टोर करें, फिर इसे 'qgraph ([arguments], layout = l)' के साथ किसी अन्य ग्राफ में उपयोग करें। अनुच्छेद में आप परत को सहेज सकते हैं जैसा कि मैंने पहले ही दिखाया है और इसे दूसरे ग्राफ में फिर से उपयोग करें। –

+0

मुझे यकीन नहीं है कि क्यों बिट है जिसमें कोड 'g <- graph.edgelist है (as.matrix (एज [, - 3] -1)) 'त्रुटि में त्रुटि उत्पन्न करता है जैसे' ग्राफ में त्रुटि (टी (एल) , निर्देशित = निर्देशित): struct_generators.c: 84 पर: अवैध (नकारात्मक) vertex आईडी, अमान्य vertex आईडी 'कोई विचार क्या समस्या है? –

1

जबकि विशेष रूप से आर उत्तर नहीं है, तो मैं नेटवर्क उत्पन्न करने के लिए साइटोसस्केप का उपयोग करने की सलाह दूंगा।

आप आरसीटोस्केप का उपयोग करके इसे स्वचालित कर सकते हैं। http://bioconductor.org/packages/release/bioc/html/RCytoscape.html

1

पैकेज 'सूचना' नामक पैकेज को निर्देशित नेटवर्क काफी अच्छी तरह से आकर्षित कर सकते हैं, और आपके मुद्दों को संभाल सकते हैं।

ex.net <- rbind(c(0, 1, 1, 1), c(1, 0, 0, 1), c(0, 0, 0, 1), c(1, 0, 1, 0)) 

plot(network(ex.net), usecurve = T, edge.curve = 0.00001, 
    edge.lwd = c(4, rep(1, 7))) 

edge.curve तर्क, अगर बहुत कम सेट और usecurve साथ = टी संयुक्त, किनारों को अलग करती है, यद्यपि वहाँ ऐसा करने का एक और अधिक सीधा रास्ता हो सकता है, और edge.lwd के रूप में एक वेक्टर ले जा सकते हैं अपने विभिन्न आकारों के लिए तर्क।

यह हमेशा सबसे सुंदर परिणाम नहीं है, मैं मानता हूं। लेकिन सभ्य दिखने वाले नेटवर्क प्लॉट्स को प्राप्त करना काफी आसान है जिसे कई अलग-अलग तरीकों से अनुकूलित किया जा सकता है (देखें? Network.plot)।

1

किनारों पर 'गैर ओवरलैपिंग' बाधा बड़ी है यहाँ समस्या सबसे पहले, आपके नेटवर्क को 'प्लानर' होना चाहिए अन्यथा यह 2-आयामों में असंभव है (आप क्रॉसओवर के बिना तीन घरों को गैस, इलेक्ट्रिक, फोन कंपनी भवनों से कनेक्ट नहीं कर सकते हैं)।

मुझे लगता है कि प्लानर ग्राफ लेआउट के लिए एक एल्गोरिदम अनिवार्य रूप से 4-रंग की समस्या हल करता है। उसके साथ मज़ा लें। हेरिस्टिक्स मौजूद हैं, प्लानर ग्राफ लेआउट की खोज करें, और बल-निर्देशित, और Planar Graph Layouts

+0

ओपी का मतलब है कि दो नोड्स के बीच किनारों को ओवरलैप नहीं करना चाहिए, सभी किनारों पर नहीं। –

+0

आह हाँ। मैं सिर्फ एक किनारे खींचता हूं और उपयुक्त अंत या सिरों पर तीरहेड छड़ी करता हूं। काम हो गया :) – Spacedman

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