Saltar al contenido

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

Solución:

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;
}

para dot produce:

gráfico de ejemplo

El lenguaje de entrada de Graphviz es bastante simple, por lo que puede generarlo por su cuenta, aunque al buscar “python graphviz” aparecen un par de bibliotecas, incluida una graphviz módulo en PyPI.

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

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)

Al usar NetworkX, una posible solución que evita la E / S de archivos y usa puntos 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 que seek(0) es necesario, consulte Cómo crear una imagen a partir de una cadena en Python

Si está 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)

Tal vez llegué un poco tarde, pero encontré otra solución para tu problema, así que lo publico para que pueda ser útil si alguien tiene el mismo problema. Esto es agregar el argumento de estilo de conexión a nx.draw:

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, connectionstyle="arc3, rad = 0.1",)

Aquí ves el resultado:

El resultado

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *