2012-07-13 7 views
45

मैं पेड़ संरचना का प्रवाह आरेख तैयार करने की कोशिश कर रहा हूं। मैं नेटवर्क x के साथ प्रतिनिधि ग्राफ बनाने में सक्षम हूं, लेकिन जब मैं एक साजिश आउटपुट करता हूं तो पेड़ संरचना दिखाने के लिए मुझे एक तरीका चाहिए। मैं ग्राफ प्लॉट करने के लिए matplotlib.pylab का उपयोग कर रहा हूँ।क्या नेटवर्कएक्स से पदानुक्रमित आउटपुट की गारंटी देने का कोई तरीका है?

मुझे here दिखाए गए समान संरचना में डेटा दिखाने की आवश्यकता है। हालांकि मेरे पास उप-ग्राफ नहीं हैं।

मैं इस तरह की संरचना की गारंटी कैसे दे सकता हूं?

अविश्वासियों के लिए उदाहरण:

Various NetworkX layouts

मैं pylab और Graphviz साथ ग्राफ़ दिखा कर लिया है, लेकिन न तो प्रस्ताव वृक्ष संरचना मैं तलाश कर रहा हूँ। मैंने प्रत्येक लेआउट नेटवर्कक्स को पेश करने की कोशिश की है, लेकिन उनमें से कोई भी पदानुक्रम दिखाता है। मुझे यह सुनिश्चित नहीं है कि विकल्प/मोड इसे या देने के लिए यदि मुझे वजन का उपयोग करने की आवश्यकता है। कोई सुझाव एक गुच्छा की मदद करेगा।

@jterrace:

यहाँ क्या मैं ऊपर भूखंडों का उत्पादन किया जाता का एक मोटा रूपरेखा है। मैंने कुछ लेबल जोड़े हैं, लेकिन इसके अलावा यह वही है।

import networkx as nx 
import matplotlib.pyplot as plt 
G = nx.Graph() 

G.add_node("ROOT") 

for i in xrange(5): 
    G.add_node("Child_%i" % i) 
    G.add_node("Grandchild_%i" % i) 
    G.add_node("Greatgrandchild_%i" % i) 

    G.add_edge("ROOT", "Child_%i" % i) 
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i) 
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) 

plt.title("draw_networkx") 
nx.draw_networkx(G) 

plt.show() 

उत्तर

64

यदि आप एक निर्देशित ग्राफ का उपयोग करते हैं तो ग्राफ़विज़ डॉट लेआउट कुछ ऐसा करेगा जो आप पेड़ के साथ चाहते हैं। यहाँ कुछ ऊपर समाधान के समान कोड से पता चलता है कि उस

import networkx as nx 
import matplotlib.pyplot as plt 
G = nx.DiGraph() 

G.add_node("ROOT") 

for i in xrange(5): 
    G.add_node("Child_%i" % i) 
    G.add_node("Grandchild_%i" % i) 
    G.add_node("Greatgrandchild_%i" % i) 

    G.add_edge("ROOT", "Child_%i" % i) 
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i) 
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) 

# write dot file to use with graphviz 
# run "dot -Tpng test.dot >test.png" 
nx.write_dot(G,'test.dot') 

# same layout using matplotlib with no labels 
plt.title('draw_networkx') 
pos=nx.graphviz_layout(G, prog='dot') 
nx.draw(G, pos, with_labels=False, arrows=False) 
plt.savefig('nx_test.png') 

Graphviz output

NetworkX/Matplotlib output

UPDATED

यहाँ करने के लिए एक संस्करण के लिए networkx-2.0 अद्यतन किया जाता है (और आगामी नेटवर्कक्स-2.1 के साथ भी तीर खींचता है)।

import networkx as nx 
from networkx.drawing.nx_agraph import write_dot, graphviz_layout 
import matplotlib.pyplot as plt 
G = nx.DiGraph() 

G.add_node("ROOT") 

for i in range(5): 
    G.add_node("Child_%i" % i) 
    G.add_node("Grandchild_%i" % i) 
    G.add_node("Greatgrandchild_%i" % i) 

    G.add_edge("ROOT", "Child_%i" % i) 
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i) 
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) 

# write dot file to use with graphviz 
# run "dot -Tpng test.dot >test.png" 
write_dot(G,'test.dot') 

# same layout using matplotlib with no labels 
plt.title('draw_networkx') 
pos =graphviz_layout(G, prog='dot') 
nx.draw(G, pos, with_labels=False, arrows=True) 
plt.savefig('nx_test.png') 

enter image description here

+0

आह हे! तो मुझे बस 'डॉट' लेआउट के साथ एक निर्देशित ग्राफ था। मुझे पता था कि यह बहुत छोटा था। बहुत बहुत धन्यवाद अरिक! – max

+0

क्या नोड्स को आरोही लेबल करने का कोई अच्छा तरीका है? इसका मतलब है, मैं एक ग्राफ 'g = nx.full_rary_tree (2, 10) बनाता हूं' अगर मैं किनारों को मुद्रित करता हूं तो मुझे मिलता है: '[(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), ...] 'लेकिन यह उन्हें एक अलग क्रम में कल्पना करेगा ... – CodeKingPlusPlus

+0

आप क्या आदेश चाहते हैं? Bfs_edges() और dfs_edges() देखें। – Aric

6

आप करीब पाने के लिए pygraphviz उपयोग कर सकते हैं:

>>> import pygraphviz 
>>> import networkx 
>>> import networkx as nx 
>>> G = nx.Graph() 
>>> G.add_node("ROOT") 
>>> for i in xrange(5): 
...  G.add_node("Child_%i" % i) 
...  G.add_node("Grandchild_%i" % i) 
...  G.add_node("Greatgrandchild_%i" % i) 
...  G.add_edge("ROOT", "Child_%i" % i) 
...  G.add_edge("Child_%i" % i, "Grandchild_%i" % i) 
...  G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) 

>>> A = nx.to_agraph(G) 
>>> A.layout('dot', args='-Nfontsize=10 -Nwidth=".2" -Nheight=".2" -Nmargin=0 -Gfontsize=8') 
>>> A.draw('test.png') 

परिणाम: enter image description here

नोट मैं लिंक आप ऊपर पोस्ट से Graphviz विकल्पों की नकल की। मुझे यकीन नहीं है कि क्यों चौथा बच्चा सख्ती से लंबवत प्रारूप के बजाय शीर्ष पर खींचा गया है। हो सकता है कि कोई भी जो ग्राफविज़ विकल्पों के बारे में और जानता हो, उसके साथ मदद कर सकता है।

+0

धन्यवाद। जब मैंने कोशिश की तो यह वही था जो मैं देख रहा था। मुझे यह कुछ हद तक अजीब लगता है कि उसने ऐसा कुछ क्यों बनाया। – max

+4

ध्यान दें कि नेटवर्क x के संस्करण 1.11 में एपीआई बदल गया है। 'To_agraph' फ़ंक्शन अब' nx.nx_agraph.to_agraph' में स्थित है। – m00am

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

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