2012-04-30 18 views
14

मैं निर्देशित ग्राफ पर होने वाली प्रक्रिया को अनुकरण करने के लिए पायथन का उपयोग कर रहा हूं। मैं इस प्रक्रिया की एक एनीमेशन तैयार करना चाहता हूं।पायथन में निर्देशित ग्राफ को इस तरह से प्लॉट करना कि सभी किनारों को अलग से दिखाएं

जिस समस्या में मैंने भाग लिया है वह यह है कि अधिकांश पायथन ग्राफ विज़ुअलाइज़ेशन लाइब्रेरी निर्देशित किनारों के जोड़े को एक किनारे में जोड़ती हैं। उदाहरण के लिए, NetworkX केवल दो किनारों खींचता है जब निम्न ग्राफ प्रदर्शित है, जबकि मैं चार किनारों में से प्रत्येक के लिए अलग से प्रदर्शित करने के लिए करना चाहते हैं: प्रत्येक के साथ

import networkx as nx 
import matplotlib.pyplot as plt 

G = nx.MultiDiGraph() 

G.add_edges_from([ 
    (1, 2), 
    (2, 3), 
    (3, 2), 
    (2, 1), 
]) 

plt.figure(figsize=(8,8)) 
nx.draw(G) 

Output from NetworkX; parallel edges are overlapping, so only two lines are displayed

मैं कुछ इस तरह प्रदर्शित करना चाहते हैं, समानांतर किनारे अलग से तैयार:

Desired output format; parallel edges are drawn separately

सवाल R reciprocal edges in igraph in R एक ही मुद्दे से निपटने के लिए लगता है, लेकिन समाधान वहाँ आर igraph पुस्तकालय के लिए है, पायथन एक नहीं।

क्या मौजूदा पायथन ग्राफ़ विज़ुअलाइजेशन लाइब्रेरी का उपयोग करके साजिश की इस शैली का उत्पादन करने का कोई आसान तरीका है? यह बोनस होगा यदि यह मल्टीग्राफ का समर्थन कर सकता है।

मैं उन समाधानों के लिए खुला हूं जो छवियों का उत्पादन करने के लिए बाहरी कार्यक्रम का आह्वान करते हैं। मैं एनीमेशन फ्रेम की एक पूरी श्रृंखला उत्पन्न करना चाहता हूं, इसलिए समाधान स्वचालित होना चाहिए।

+0

संबंधित http://stackoverflow.com/questions/15053686/networkx-overlappin g-edges-when-visualizing-multigraph –

उत्तर

15

Graphviz उपकरण अलग किनारों को प्रदर्शित करने के लिए प्रकट होते हैं।

उदाहरण के लिए

, इस दे रही है:

digraph G { 
    A -> B; 
    A -> B; 
    A -> B; 
    B -> C; 

    B -> A; 
    C -> B; 
} 

dot को पैदा करता है:

example graph

Graphviz के इनपुट भाषा, बहुत सरल है ताकि आप अपने दम पर यह उत्पन्न कर सकते हैं, हालांकि "अजगर के लिए खोज ग्राफविज़ "कुछ पुस्तकालयों को चालू करता है।

+2

यह पता चला है कि नेटवर्कएक्स [pydot का उपयोग कर निर्यात। डॉट फ़ाइलें] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_pydot) या [pygraphviz] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_agraph), इसलिए यह पूरी तरह से काम करता है। धन्यवाद! –

9

NetworkX, एक संभावित समाधान, जो बचा जाता है फ़ाइल मैं/हे और लेआउट के लिए pydot के माध्यम से डॉट का उपयोग करता है का उपयोग करना है:

import networkx as nx 
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
from cStringIO import StringIO 

g = nx.dodecahedral_graph() 
d = nx.drawing.nx_pydot.to_pydot(g) # d is a pydot graph object, dot options can be easily set 
# attributes get converted from networkx, 
# use set methods to control dot attributes after creation 

png_str = d.create_png() 
sio = StringIO() # file-like string, appropriate for imread below 
sio.write(png_str) 
sio.seek(0) 

img = mpimg.imread(sio) 
imgplot = plt.imshow(img) 
क्यों seek(0) की जरूरत है के लिए

, How to create an image from a string in python

देखते हैं, तो IPython भीतर (क्यूटी) कंसोल, फिर ऊपर इनलाइन प्रिंट होगा और अधिक प्रत्यक्ष दृष्टिकोण है:

import networkx as nx 
from IPython.display import Image 

g = nx.dodecahedral_graph() 
d = nx.drawing.nx_pydot.to_pydot(g) 

png_str = d.create_png() 
Image(data=png_str) 
+0

इस उदाहरण को अद्यतन करने की आवश्यकता है: 'nx.to_pydot' अब उपलब्ध नहीं है। इसके बजाय आपको 'pydotplus' स्थापित करना चाहिए और फिर इसके बजाय 'nx.drawing.nx_pydot.to_pydot' का उपयोग करना चाहिए। – ogrisel

+1

इस उदाहरण को अपडेट करने की आवश्यकता को बढ़ाने के लिए धन्यवाद, मैंने इसे अपडेट किया। 'pydotplus' को पहले से ही 'pydot' में अपस्ट्रीम' नेटवर्कक्स' में वापस कर दिया गया है, कृपया [यह पीआर] देखें (https://github.com/networkx/networkx/pull/2272)। –

+0

यदि pydotplus को आपके 'graphviz' इंस्टालेशन नहीं मिलते हैं तो यह 'InvocationException: GraphViz के निष्पादन योग्य नहीं मिलेगा' फेंक देगा। वर्तमान कार्य निष्पादन के लिए इसे सिस्टम पथ में जोड़ने के लिए एक वर्कअराउंड है: 'os' आयात करें, फिर 'os.environ ["पथ"] + = r "; सी: \ Anaconda \ envs \ testes \ Library \ bin \ graphviz" जहां आपको उस फ़ोल्डर को प्रतिस्थापित करना चाहिए जहां आपके ग्राफ़विज़ निष्पादन योग्य स्थित हैं। – mvbentes