tiempo real matrices graficos grafico graficas graficar ejes barras python graph-visualization

real - plot python



Trazar gráficos dirigidos en Python de manera que muestre todos los bordes por separado (2)

Las herramientas de Graphviz parecen mostrar bordes distintos.

Por ejemplo, dando esto:

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

al dot produce:

El lenguaje de entrada de Graphviz es bastante simple, por lo que puede generarlo por su cuenta, aunque la búsqueda de "python graphviz" muestra un par de bibliotecas que incluyen un módulo de graphviz en PyPI .

Aquí está python que genera el gráfico anterior usando el módulo graphviz :

from graphviz import Digraph dot = Digraph() dot.node(''A'', ''A'') dot.node(''B'', ''B'') dot.node(''C'', ''C'') dot.edges([''AB'', ''AB'', ''AB'', ''BC'', ''BA'', ''CB'']) print(dot.source) dot.render(file_name, view=True)

Estoy usando Python para simular un proceso que tiene lugar en gráficos dirigidos. Me gustaría producir una animación de este proceso.

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 dibuja solo dos bordes al mostrar 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)

Me gustaría mostrar algo como esto, con cada borde paralelo dibujado por separado:

La pregunta R bordes recíprocos en igraph en R parece tratar el mismo problema, pero la solución que existe para la biblioteca R igraph, no la de Python.

¿Hay una manera fácil de producir este estilo de trama utilizando una biblioteca de visualización de gráficos de Python existente? Sería una ventaja si pudiera soportar multigraphs.

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


Usando NetworkX, una posible solución que evita la E / S de archivos y usa el punto a través de pydot para el diseño es:

import networkx as nx import matplotlib.pyplot as plt import matplotlib.image as mpimg from io import BytesIO 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 = BytesIO() # file-like string, appropriate for imread below sio.write(png_str) sio.seek(0) img = mpimg.imread(sio) imgplot = plt.imshow(img)

para saber por qué se necesita seek(0) , consulte Cómo crear una imagen desde una cadena en python

Si dentro de la consola de IPython (qt), 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)