pydot

2011-01-04 13 views
13

का उपयोग करके सहेजने के बिना ग्राफ को प्रदर्शित करें मैं pydot का उपयोग करके एक साधारण ग्राफ प्रदर्शित करने की कोशिश कर रहा हूं।pydot

मेरा सवाल यह है कि फ़ाइल को लिखने के बिना ग्राफ को प्रदर्शित करने का कोई तरीका है क्योंकि वर्तमान में मैं पहले ड्रॉ में लेखन फ़ंक्शन का उपयोग करता हूं और फिर फ़ाइलों को दिखाने के लिए छवि मॉड्यूल का उपयोग करना होता हूं।

हालांकि क्या कोई तरीका है कि ग्राफ को बिना सहेजे बिना स्क्रीन पर मुद्रित किया जाता है ??


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

इसके अलावा देखा .... कभी-कभी मुझे यह त्रुटि मिलती है कि छवि खोला नहीं जा सका क्योंकि इसे या तो हटाया गया था या अनुपलब्ध स्थान में सहेजा गया था जो सही नहीं है क्योंकि मैं इसे अपने डेस्कटॉप पर सहेज रहा हूं ..... क्या कोई जानता है कि क्या है हो रहा है और वहाँ एक तेज़ तरीका छवि लोड करने के लिए है .....

धन्यवाद एक बहुत ....

+0

संबंधित: http://stackoverflow.com/questions/10379448/plotting-directed-graphs-in-python -इन-ए-वे-द-शो-ऑल-एज-अलग/17823100 # 17823100 –

उत्तर

2

मुझे डर लग रहाग्राफ को प्रस्तुत करने के लिएgraphviz का उपयोग करता है। यानी, यह निष्पादन योग्य चलाता है और परिणामस्वरूप छवि लोड करता है।

नीचे पंक्ति - नहीं, आप फ़ाइल बनाने से नहीं बच सकते हैं।

+1

फ़ाइल को जल्दी से खोलने का कोई तरीका है लेकिन ??? उत्तर –

+1

के लिए बहुत बहुत धन्यवाद johntex ने एक समाधान प्रदान किया – elgehelge

+0

मेरा समाधान देखें। यह आसान है और फ़ाइल बनाने से बचाता है :) – micahscopes

3

पर this answer आधारित (अजगर में छवियों को दिखाने के लिए कैसे), यहाँ कुछ लाइनें है:

gr = ... <pydot.Dot instance> ... 

import tempfile, Image 
fout = tempfile.NamedTemporaryFile(suffix=".png") 
gr.write(fout.name,format="png") 
Image.open(fout.name).show() 

ImageGraphViz के dot फोन करके Python Imaging Library

17

आप pydot से छवि प्रदान कर सकते हैं से है डिस्क पर किसी भी फाइल लिखने के बिना। फिर बस इसे साजिश करें।

from cStringIO import StringIO 

import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
import networkx as nx 

# create a networkx graph 
G = nx.MultiDiGraph() 
G.add_nodes_from([1,2]) 
G.add_edge(1, 2) 

# convert from networkx -> pydot 
pydot_graph = G.to_pydot() 

# render pydot by calling dot, no file saved to disk 
png_str = pydot_graph.create_png(prog='dot') 

# treat the dot output string as an image file 
sio = StringIO() 
sio.write(png_str) 
sio.seek(0) 
img = mpimg.imread(sio) 

# plot the image 
imgplot = plt.imshow(img, aspect='equal') 
plt.show(block=False) 

यह निर्देशित रेखांकन के लिए विशेष रूप से उपयोगी है, क्योंकि networkx की matplotlib क्षमताओं रेखांकन के लिए severely limited हैं: यह इस प्रकार किया जा सकता है, g संभालने एक pydot ग्राफ है।

यह भी देखें pull request, जो ऐसी क्षमताओं को सीधे networkx पर प्रस्तुत करता है। द्वारा फ़ाइल एक्सचेंज GraphViz interface, MATLAB GraphViz Layout importer, GraphViz4Matlab पर MATLAB के लिए बनाए गए लेआउट को लोड और प्लॉट करने के लिए कोई इंटरफ़ेस लिखना है।

+3

बस एक त्वरित अनुलग्नक के रूप में, यदि आप एक नोटबुक में हैं तो आप 'छवि (png_str) '(' IPython.display' से) का उपयोग करके सीधे' png_str' (बाइट्स) प्रस्तुत कर सकते हैं। – meloncholy

+0

इस अनुकूलन में कुछ मामूली समायोजन किए गए: https://github.com/EricCousineau-TRI/repro/blob/d74ecbd4fdfdaa115bf28b2db15c7e296553435d/python/matplotlib/graphviz.py#L9 इस कोड को पोस्ट करने के लिए धन्यवाद! (केवल 'pydot' का उपयोग करके समाप्त हुआ, क्योंकि यह इस मामले में रुचि के ग्राफ को संभालने में सक्षम था।) –

+1

@EricCousineau कथन द्वारा' g = pydot.graph_from_dot_data (dot_text) 'ऐसा प्रतीत होता है कि आप पुराने 'pydot का उपयोग कर रहे हैं 'संस्करण। कृपया ध्यान दें कि 'pydot == 1.2.3' के रूप में, फ़ंक्शन 'graph_from_dot_data' सभी मामलों में' सूची 'देता है (पिछले संस्करणों में यह सिंगलटन के दौरान एक ग्राफ लौटाता है)। यह भी देखें [यह टिप्पणी] (https://github.com/erocarrera/pydot/issues/159#issuecomment-334799706), और https://github.com/erocarrera/pydot/blob/35a8d858bd9da0b37268fe9b317fe4895387e75f/pydot.py#L235 , https://github.com/erocarrera/pydot/blob/35a8d858bd9da0b37268fe9b317fe4895387e75f/dot_parser.py#L545। –

6

यहाँ एक सरल उपाय IPython का उपयोग कर रहा है:

from IPython.display import Image, display 

def viewPydot(pdot): 
    plt = Image(pdot.create_png()) 
    display(plt) 

उदाहरण उपयोग:

import networkx as nx 
toPdot = nx.drawing.nx_pydot.to_pydot 
pdot = toPdot(nx.complete_graph(5)) 
viewPydot(pdot)