2012-04-30 9 views
14

Estoy usando Python para simular un proceso que tiene lugar en gráficos dirigidos. Me gustaría producir una animación de este proceso.Trazado de gráficos dirigidos en Python de manera que muestren todos los bordes por separado

El problema con el que me he encontrado es que la mayoría de las bibliotecas de visualización de gráficos de Python combinan pares de bordes dirigidos en un solo borde. Por ejemplo, NetworkX empates sólo dos bordes cuando se muestra el siguiente gráfico, mientras que me gustaría mostrar cada uno de los cuatro bordes por separado:

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

me gustaría ver algo como esto, con cada borde paralelo dibujado por separado:

Desired output format; parallel edges are drawn separately

la pregunta R reciprocal edges in igraph in R parece que lidiar con el mismo problema, pero la solución no es para la biblioteca R igraph, no para Python.

¿Existe alguna manera fácil de generar este estilo de trazado utilizando una biblioteca de visualización de gráficos Python existente? Sería una ventaja si pudiera soportar multigrafos.

Estoy abierto a soluciones que invocan un programa externo para producir las imágenes. Me gustaría generar una serie completa de cuadros de animación, por lo que la solución debe ser automática.

+0

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

Respuesta

15

Las herramientas Graphviz parecen mostrar bordes distintos.

Por ejemplo, dando a este:

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

    B -> A; 
    C -> B; 
} 

a dot produce:

example graph

idioma de entrada de Graphviz es bastante simple para que pueda generar por su cuenta, a pesar de la búsqueda de "pitón graphviz "aparece un par de bibliotecas.

+2

Resulta que NetworkX puede [exportar archivos .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), por lo que esto funciona perfectamente. ¡Gracias! –

9

Usando NetworkX, una posible solución que evita archivo de E/S y utiliza de puntos a través de pydot para la disposición es:

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) 

de por qué se necesita seek(0), ver How to create an image from a string in python

Si dentro IPython (qt) consola, entonces lo anterior se imprimirá en línea y un enfoque más directo es:

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

Este ejemplo debe actualizarse: 'nx.to_pydot' ya no está disponible. En su lugar, debe instalar '' pip install pydotplus' y luego usar 'nx.drawing.nx_pydot.to_pydot' en su lugar. – ogrisel

+1

Gracias por aumentar la necesidad de actualizar este ejemplo, lo actualicé. 'pydotplus' ya ha sido revertido a' pydot' en 'networkx', ver [este PR] (https://github.com/networkx/networkx/pull/2272). –

+0

Si pydotplus no encuentra su instalación de 'graphviz' lanzará' InvocationException: los ejecutables de GraphViz no encontrados'. Una solución alternativa es agregarlo a la ruta del sistema para la ejecución actual de esta manera: 'import os' luego' os.environ ["PATH"] + = r "; C: \ Anaconda \ envs \ testés \ Biblioteca \ bin \ graphviz" ' donde debe reemplazar la carpeta donde se encuentran sus ejecutables graphviz. – mvbentes

Cuestiones relacionadas