2012-04-30 10 views
14

Ich benutze Python, um einen Prozess zu simulieren, der auf gerichteten Graphen stattfindet. Ich möchte eine Animation dieses Prozesses erstellen.Plotten von gerichteten Graphen in Python in einer Weise, die alle Kanten getrennt zeigt

Das Problem, das ich habe, ist, dass die meisten Python Graph Visualisierungsbibliotheken Paare von gerichteten Kanten zu einer einzigen Kante kombinieren. Zum Beispiel zieht NetworkX nur zwei Kanten, wenn die folgende Grafik anzeigt, während ich jeden der vier Kanten möchte separat angezeigt werden:

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

Ich mag so etwas zeigen, mit jedem parallele Kante separat gezeichnet:

Desired output format; parallel edges are drawn separately

die Frage R reciprocal edges in igraph in R scheint mit dem gleichen Thema zu befassen, aber die Lösung gibt ist für die Bibliothek, nicht die Python-Bibliothek.

Gibt es eine einfache Möglichkeit, diesen Plotstil mit einer vorhandenen Python-Graph-Visualisierungsbibliothek zu erstellen? Es wäre ein Bonus, wenn Multigraphen unterstützt werden könnten.

Ich bin offen für Lösungen, die ein externes Programm zur Erstellung der Bilder aufrufen. Ich möchte eine ganze Reihe von Animationsframes generieren, daher muss die Lösung automatisiert werden.

+0

Verwandte http://stackoverflow.com/questions/15053686/networkx-overlappin g-edges-wenn-Visualisierung-Multigraph –

Antwort

15

Die Werkzeuge Graphviz scheinen unterschiedliche Kanten anzuzeigen.

Zum Beispiel geben dies:

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

    B -> A; 
    C -> B; 
} 

zu dot produziert:

example graph

Graphviz Eingabesprache ist ziemlich einfach, so können Sie es auf eigene Faust generieren, wenn für „Python gesucht Graphviz "zeigt ein paar Bibliotheken.

+2

Es stellt sich heraus, dass NetworkX [.dot-Dateien mit Pydot exportieren] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_pydot) oder [pygraphviz] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_agraph), so das funktioniert perfekt. Vielen Dank! –

9

Mit NetworkX, eine mögliche Abhilfe, die Datei-I/O vermeidet und verwendet Punkt über pydot für das Layout ist:

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) 

warum seek(0) benötigt wird, siehe How to create an image from a string in python

Wenn innerhalb IPython (qt) Konsole, dann wird die oben drucken Inline- und ein direkterer Ansatz ist:

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

Dieses Beispiel muss aktualisiert werden: 'nx.to_pydot' ist nicht mehr verfügbar. Stattdessen sollten Sie 'pip install pydotplus' installieren und dann' nx.drawing.nx_pydot.to_pydot' stattdessen verwenden. – ogrisel

+1

Danke, dass Sie dieses Beispiel aktualisieren müssen, ich habe es aktualisiert. 'pydotplus' wurde bereits in upstream' networkx' auf 'pydot' zurückgesetzt, siehe [this PR] (https://github.com/networkx/networkx/pull/2272). –

+0

Wenn pydotplus Ihre 'graphviz'-Installation nicht findet, wird' InvocationException: GraphViz 'ausführbare Dateien nicht gefunden. Eine Umgehungslösung besteht darin, sie wie folgt zum Systempfad für die aktuelle Ausführung hinzuzufügen: 'import os' dann' os.environ ["PATH"] + = r "; C: \ Anaconda \ envs \ testes \ Library \ bin \ graphviz" ' Hier sollten Sie den Ordner ersetzen, in dem sich die ausführbaren Graphvid-Dateien befinden. – mvbentes

Verwandte Themen