2011-01-04 13 views
13

Próbuję wyświetlić prosty wykres za pomocą programu pydot.Wyświetlany wykres bez zapisywania za pomocą polecenia pydot

Moje pytanie brzmi: czy istnieje sposób wyświetlania wykresu bez zapisywania go do pliku, ponieważ obecnie używam funkcji zapisu do pierwszego losowania, a następnie muszę użyć modułu Obraz, aby wyświetlić pliki.

Czy istnieje jednak sposób, w jaki wykres jest drukowany bezpośrednio na ekranie bez zapisywania?


także jako aktualizacja chciałbym zapytać w tym samym pytaniem, które obserwuję, że choć obraz zostaje zapisany bardzo szybko, kiedy użyć polecenia show modułu obrazu zajmuje zauważalny czas obraz będzie Widać .... Czasami pojawia się błąd, że obraz nie mógł zostać otwarty, ponieważ został usunięty lub zapisany w niedostępnej lokalizacji, co nie jest poprawne, ponieważ zapisuję go na moim pulpicie ... Czy ktoś wie, co to jest dzieje i czy istnieje szybszy sposób, aby uzyskać obraz załadowany .....

Bardzo dziękuję ....

+0

Podobne: http://stackoverflow.com/questions/10379448/plotting-directed-graphs-in-python -in-a-way-that-show-all-edges-separate/17823100 # 17823100 –

Odpowiedz

2

Obawiam pydot używa graphviz do renderowania wykresów. Oznacza to, że uruchamia plik wykonywalny i ładuje wynikowy obraz.

Dolna linia - nie, nie można uniknąć utworzenia pliku.

+1

Czy istnieje sposób, aby szybko otworzyć plik, ale ??? Wielkie dzięki za odpowiedź –

+1

johntex pod warunkiem, że rozwiązanie – elgehelge

+0

sprawdź moje rozwiązanie. to proste i unika tworzenia pliku :) – micahscopes

3

podstawie this answer (sposobu wyświetlania obrazów w Pythonie), oto kilka linii:

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

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

Image jest od Python Imaging Library

17

Można uczynić obraz z pydot wywołując GraphViz „s dot bez zapisywania jakichkolwiek plików na dysk. Następnie spisekuj go. Można tego dokonać w następujący sposób: przyjmując g jest pydot wykres:

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) 

ten jest szczególnie przydatny dla wykorzystania wykresów ponieważ matplotlib możliwości networkxseverely limited takich wykresów.

Zobacz także ten pull request, który wprowadza takie możliwości bezpośrednio do networkx. Pozostaje tylko napisanie interfejsu do załadowania i wydrukowania układu wygenerowanego przez GraphViz jako pliku dla MATLAB na giełdzie plików GraphViz interface, MATLAB GraphViz Layout importer, GraphViz4Matlab.

+3

Podobnie jak szybki dodatek, jeśli jesteś w zeszycie, możesz renderować 'png_str' (bytes) bezpośrednio używając' Image (png_str) '(z' IPython.display'). – meloncholy

+0

Wprowadzono drobne poprawki w tej adaptacji: https://github.com/EricCousineau-TRI/repro/blob/d74ecbd4fdfdaa115bf28b2db15c7e296553435d/python/matplotlib/graphviz.py#L9 Dziękujemy za opublikowanie tego kodu! (Skończyło się na używaniu 'pydot', ponieważ było w stanie obsłużyć wykres zainteresowania w tym przypadku.) –

+1

@EricCousineau Przez wyrażenie' g = pydot.graph_from_dot_data (dot_text) 'wydaje się, że używasz starszego' pydot 'wersja. Zwróć uwagę, że począwszy od 'pydot == 1.2.3', funkcja' graph_from_dot_data' zwraca we wszystkich przypadkach 'list' (w poprzednich wersjach zwracała wykres, gdy singleton). Zobacz także [ten komentarz] (https://github.com/erocarrera/pydot/issues/159#issuecomment-334799706) i https://github.com/erocarrera/pydot/blob/35a8d858bd9da0b37268fe9b317fe4895387e75f/pydot.py#L235 , https://github.com/erocarrera/pydot/blob/35a8d858bd9da0b37268fe9b317fe4895387e75f/dot_parser.py#L545. –

6

Oto proste rozwiązanie wykorzystujące ipython:

from IPython.display import Image, display 

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

Przykład użycia:

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