2012-04-30 11 views
14

Używam Pythona do symulacji procesu, który ma miejsce na skierowanych wykresach. Chciałbym przedstawić animację tego procesu.Wykreślanie grafów w języku Python w sposób pokazujący wszystkie krawędzie oddzielnie

Problemem, który napotkałem, jest to, że większość bibliotek wizualizacji wykresów Python łączy pary skierowanych krawędzi w jedną krawędź. Na przykład, NetworkX rysuje tylko dwie krawędzie przy wyświetlaniu na poniższy wykres, natomiast chciałbym, aby wyświetlić każdy z czterech krawędziach oddzielnie:

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

Chciałbym wyświetlić coś takiego, z każdym krawędź równolegle sporządzone oddzielnie:

Desired output format; parallel edges are drawn separately

pytanie R reciprocal edges in igraph in R zdaje sobie z tego samego problemu, ale rozwiązanie nie jest dla biblioteki Rigraph, a nie dla Pythona.

Czy istnieje prosty sposób na stworzenie tego stylu fabuły przy użyciu istniejącej biblioteki wizualizacji wykresów Pythona? Byłaby to premia, gdyby mogła wspierać multigraphy.

Jestem otwarty na rozwiązania, które wywołują zewnętrzny program do tworzenia obrazów. Chciałbym wygenerować całą serię ramek animacji, więc rozwiązanie musi być zautomatyzowane.

+0

Podobne http://stackoverflow.com/questions/15053686/networkx-overlappin g-edges-when-wizualizing-multigraph –

Odpowiedz

15

Narzędzia Graphviz wydają się wyświetlać wyraźne krawędzie.

Na przykład, dając w ten sposób:

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

    B -> A; 
    C -> B; 
} 

do dot produkuje:

example graph

język wejście Graphviz jest bardzo prosty, dzięki czemu można wygenerować go na własną rękę, jakby szukając „python graphviz "tworzy kilka bibliotek.

+2

Okazuje się, że NetworkX może [eksportować pliki .dot przy użyciu pydot] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_pydot) lub [pygraphviz] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_agraph), więc to działa idealnie. Dzięki! –

9

Korzystanie NetworkX, możliwego obejścia który unika pliku I/O i wykorzystuje kropkę poprzez pydot dla układu to:

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) 

dlaczego seek(0) jest potrzebne, zobacz How to create an image from a string in python

Jeżeli w ciągu ipython (qt) konsola, to powyższe zostanie wydrukowany inline i bardziej bezpośrednie podejście jest:

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

Ten przykład musi zostać zaktualizowany: 'nx.to_pydot' nie jest już dostępny. Zamiast tego powinieneś 'pip install pydotplus', a następnie użyć' nx.drawing.nx_pydot.to_pydot' zamiast tego. – ogrisel

+1

Dziękujemy za zgłoszenie potrzeby aktualizacji tego przykładu, zaktualizowałem go. 'pydotplus' został już przywrócony do' pydot' w źródłowym 'networkx', zobacz [to PR] (https://github.com/networkx/networkx/pull/2272). –

+0

Jeśli pydotplus nie znajdzie instalacji 'graphviz', wyświetli' InvocationException: nie znaleziono plików wykonywalnych GraphViz'. Obejściem jest dodanie go do ścieżki systemowej dla bieżącego wykonywania w następujący sposób: 'import os' then' os.environ ["PATH"] + = r "; C: \ Anaconda \ envs \ testes \ Library \ bin \ graphviz" ' gdzie powinieneś zamienić folder, w którym znajdują się pliki wykonywalne graphviz. – mvbentes