2012-12-20 11 views
7

मुझे कुछ संभाव्य नियंत्रण प्रवाह ग्राफ़ आकर्षित करने की आवश्यकता है। यानी किनारों पर चित्रित संभाव्यताओं के साथ प्रवाह प्रवाह नियंत्रित करें।ग्राफ-टूल: मेरे थीसिस के लिए किनारों पर टेक्स्ट ड्रा

मुझे ग्राफ-टूल मिला जो काफी उपयोगी लगता है, क्योंकि यह मौजूदा ग्राफ की गहरी प्रतियों का उपयोग कर सकता है और मेरे ग्राफ काफी समान हैं।

तो मेरा सवाल यह है कि यदि किनारों पर/किनारों के किनारे किनारे गुण (या कुछ तार) खींचने की संभावना है? यदि यह संभव नहीं है या अत्यधिक जटिल है, तो क्या ऐसा कोई उपकरण है जो इस मामले में उपयोग करना बेहतर है?

संपादित करें: मैं निर्देशित किनारों कि यहां तक ​​कि 2 नोड्स के बीच छोरों बना सकते हैं और अलग-अलग मान सकते हैं की जरूरत है। क्या इसके लिए भी कोई संभावना है? तो मैं दोनों मूल्यों को देख सकता हूँ? अब तक मैं निर्देशित ग्राफ को 2-दिशात्मक किनारे के साथ देख सकता हूं, लेकिन इसमें केवल एक ही मूल्य है।

तो उदा। networkx में (झुका के संदर्भ में) यह लगेगा की तरह:

G = nx.MultiDiGraph() 
G.add_edge(0,1) 
G.add_edge(1,0) 
labels = {(0,1):'foo', (1,0):'bar'} 

तो है कि दोनों 'foo' और 'बार' दिखाई दे रहे हैं और आप देख सकते हैं किस दिशा वे से जुड़े हैं।

लेकिन जैसा कि नेटवर्कक्स इसे प्रस्तुत करता है, मुझे 1 लेबल के साथ 1 बिडरेक्शनल एज मिलता है।

उत्तर

2
import networkx as nx 

# Sample graph 
G = nx.Graph() 
G.add_edge(0,1) 
G.add_edge(1,2) 
G.add_edge(2,3) 
G.add_edge(1,3) 

labels = {(0,1):'foo', (2,3):'bar'} 

pos=nx.spring_layout(G) 

nx.draw(G, pos) 
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels,font_size=30) 

import pylab as plt 
plt.show() 

enter image description here

संपादित करें: यदि आप किनारे लेबल के साथ multidigraphs जरूरत हैं, तो मुझे नहीं लगता कि आप पूरी तरह से networkx भीतर ऐसा कर सकते हैं करते हैं। लेकिन अगर आप अजगर में इसके बारे में सबसे अधिक है और अन्य प्रोग्राम के साथ प्रतिपादन और लेआउट कर सकते हैं:

import networkx as nx 

G = nx.MultiDiGraph() 
G.add_edge(0,1, label='A') 
G.add_edge(1,0, label='B') 
G.add_edge(2,3, label='foo') 
G.add_edge(3,1, label='bar') 
nx.write_dot(G, 'my_graph.dot') 

मैं graphviz किसी छवि का उपयोग में इस बारी करने के। मेरी यूनिक्स मशीन पर मैं कमांड लाइन

dot my_graph.dot -T png > output.png 

कौन सा वांछित आउटपुट आप देख रहे हैं देता से चलाते हैं। ध्यान दें कि ग्राफ़विज़ में many ways to customize the visual appearance है। ऊपर के उदाहरण बस का उत्पादन:

enter image description here

+0

खुशी है कि यह मदद की! मुझे नहीं पता कि आपको वास्तव में क्या चाहिए, लेकिन नेटवर्कएक्स निर्देशित और मल्टीग्राफ ग्राफ भी खींच सकता है। अपने थीसिस के लिए, परिणामस्वरूप छवि को पीडीएफ के रूप में सहेजना सुनिश्चित करें, गुणवत्ता को बनाए रखने के लिए पीएनजी के रूप में नहीं (पूर्व http://stackoverflow.com/a/9890599/249341) – Hooked

+0

मैं सिर्फ ट्यूटोरियल पढ़ रहा हूं और कोशिश की मल्टीडिग्राफ क्योंकि मुझे निर्देशित किनारों की आवश्यकता है जो 2 नोड्स के बीच लूप भी बना सकते हैं और अलग-अलग मान हैं। क्या इसके लिए भी कोई संभावना है? तो मैं दोनों मूल्यों को देख सकता हूँ? अब तक मैं निर्देशित ग्राफ को 2-दिशात्मक किनारे के साथ देख सकता हूं, लेकिन इसमें केवल एक ही मूल्य है। –

7

आप पाठ अगले किनारों को graph-tool साथ graph_draw() फ़ंक्शन की "edge_text" विकल्प का उपयोग आकर्षित कर सकते हैं:

from graph_tool.all import * 

g = Graph() 
g.add_vertex(4) 
label = g.new_edge_property("string") 
e = g.add_edge(0, 1) 
label[e] = "A" 
e = g.add_edge(2, 3) 
label[e] = "foo" 
e = g.add_edge(3, 1) 
label[e] = "bar" 
e = g.add_edge(0, 3) 
label[e] = "gnat" 

graph_draw(g, edge_text=label, edge_font_size=40, edge_text_distance=20, edge_marker_size=40, output="output.png") 

enter image description here

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