क्या नेटवर्कएक्स से पदानुक्रमित आउटपुट की गारंटी देने का एक तरीका है?


86

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

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

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

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

विभिन्न NetworkX लेआउट

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

@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()

जवाबों:


118

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

import networkx as nx
from networkx.drawing.nx_agraph import 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"
nx.nx_agraph.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=False)
plt.savefig('nx_test.png')

ग्राफविज़ आउटपुट

NetworkX / Matplotlib आउटपुट

अद्यतन

यहाँ networkx-2.0 (और आगामी networkx-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')

यहां छवि विवरण दर्ज करें


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

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

1
PyGrapviz Python 3 के साथ काम करता है और यह कोड Python 3 के साथ काम करेगा
Aric

3
अगर आप किसी भी समस्या pygraphvizको नियमित तरीके से स्थापित कर रहे हैं, तो कोशिश करेंpip install --install-option="--include-path=/usr/local/include/" --install-option="--library-path=/usr/local/lib/" pygraphviz
Rotail

2
@ रूट ने मेरे द्वारा इंस्टॉल किए जाने के बाद graphviz(मेरे मामले में brew install graphviz) का उपयोग करके मेरे लिए यह काम किया ।
शिवेंद्र

10

पास पाने के लिए आप 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')

परिणाम: यहां छवि विवरण दर्ज करें

नोट मैंने आपके द्वारा ऊपर दिए गए लिंक से ग्राफविज़ विकल्पों को कॉपी किया है। मुझे यकीन नहीं है कि कड़ाई से ऊर्ध्वाधर प्रारूप के बजाय 4 वें बच्चे को शीर्ष पर क्यों खींचा गया है। हो सकता है कि कोई व्यक्ति जो ग्रेविज़ विकल्पों के बारे में अधिक जानता हो, वह इसकी मदद कर सकता है।


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

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

1
क्या यह सुनिश्चित करने का एक तरीका है कि बच्चा हमेशा अपने माता-पिता से नीचे हो?
Dror

0

यदि आप ग्राफविज़ को स्थापित नहीं करना चाहते हैं, तो आप केवल अजगर समाधान के लिए ग्रैंडाल्फ का उपयोग कर सकते हैं ।

इसके अलावा, इस प्रकार के विज़ुअलाइज़ेशन को एक स्तरित ग्राफ़ ड्राइंग या सुगियामा-शैली ग्राफ़ ड्राइंग कहा जाता है , जो गैर-पेड़ों सहित कई प्रकार के ग्राफ़ प्रदर्शित कर सकता है।

विवरण और कार्यान्वयन के लिए एक अलग प्रश्न के लिए मेरा जवाब देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.