2012-04-30 17 views
14

Sto usando Python per simulare un processo che si svolge su grafici diretti. Mi piacerebbe produrre un'animazione di questo processo.Tracciare grafici diretti in Python in modo da mostrare tutti i bordi separatamente

Il problema che ho incontrato è che la maggior parte delle librerie di visualizzazione del grafico Python combinano coppie di bordi diretti in un unico bordo. Ad esempio, NetworkX disegna solo due bordi quando visualizza il grafico seguente, che desidero visualizzare ciascuno dei quattro bordi separatamente:

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

Vorrei cosa di questo tipo, con ogni bordo parallelo disegnato separatamente:

Desired output format; parallel edges are drawn separately

la domanda R reciprocal edges in igraph in R sembra trattare lo stesso problema, ma la soluzione ci è per la libreria R igraph, non per quella Python.

C'è un modo semplice per produrre questo stile di trama utilizzando una libreria di visualizzazione del grafico Python esistente? Sarebbe un vantaggio se potesse supportare le multigrafi.

Sono aperto a soluzioni che invocano un programma esterno per produrre le immagini. Mi piacerebbe generare un'intera serie di frame di animazione, quindi la soluzione deve essere automatizzata.

+0

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

risposta

15

Gli strumenti Graphviz sembrano mostrare bordi distinti.

Ad esempio, dando in questo modo:

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

    B -> A; 
    C -> B; 
} 

al dot produce:

example graph

lingua di input di Graphviz è abbastanza semplice in modo è possibile generare da soli, anche se la ricerca di "pitone graphviz "mostra un paio di librerie.

+2

Si scopre che NetworkX può esportare file .dot usando pydot] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_pydot) o [pygraphviz] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_agraph), quindi funziona perfettamente. Grazie! –

9

Utilizzando NetworkX, una possibile soluzione che evita file di I/O e usa dot via pydot per il layout è:

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) 

del motivo per cui è necessario seek(0), vedere How to create an image from a string in python

Se entro IPython (qt) console, quindi quanto sopra verrà stampata in linea e un approccio più diretto è:

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

Questo esempio deve essere aggiornato: 'nx.to_pydot' non è più disponibile. Invece dovresti 'pip installare pydotplus' e quindi usare' nx.drawing.nx_pydot.to_pydot' invece. – ogrisel

+1

Grazie per aver aumentato la necessità di aggiornare questo esempio, l'ho aggiornato. 'pydotplus' è già stato ripristinato su' pydot' in 'networkx' upstream, per favore vedi [questa PR] (https://github.com/networkx/networkx/pull/2272). –

+0

Se pydotplus non trova l'istallazione 'graphviz', genera' InvocationException: gli eseguibili di GraphViz non trovati'. Una soluzione alternativa è di aggiungerla al percorso di sistema per l'esecuzione corrente come questa: 'import os' quindi' os.environ ["PATH"] + = r "; C: \ Anaconda \ envs \ testes \ Library \ bin \ graphviz" ' dove è necessario sostituire la cartella in cui si trovano i file eseguibili di Graphviz. – mvbentes

Problemi correlati