¿Hay alguna manera de garantizar la salida jerárquica de NetworkX?


Estoy tratando de producir un diagrama de flujo de una estructura de árbol . He podido crear gráficos representativos con networkx, pero necesito una forma de mostrar la estructura tree cuando emito un gráfico. Estoy usando matplotlib.pylab para trazar el gráfico.

Necesito mostrar los datos en una estructura similar a lo que se muestra aquí. Aunque no tengo sub-gráficos.

¿Cómo puedo garantizar una estructura como esa?

Ejemplos para el no creyentes:

Varios diseños de NetworkX

He podido mostrar los gráficos con pylab y graphviz, pero ninguno ofrece la estructura de árbol que estoy buscando. He probado todos los diseños que networkx tiene para ofrecer, pero ninguno de ellos muestra una jerarquía . Simplemente no estoy seguro de qué opciones/mododarle O si necesito usar pesos. Cualquier sugerencia ayudaría mucho.

@jterrace:

Aquí hay un esbozo de lo que usé para producir las parcelas anteriores. He añadido algunos etiquetas, pero aparte de eso es lo mismo.

import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()

G.add_node("ROOT")

for i in xrange(5):
    G.add_node("Child_%i" % i)
    G.add_node("Grandchild_%i" % i)
    G.add_node("Greatgrandchild_%i" % i)

    G.add_edge("ROOT", "Child_%i" % i)
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i)
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i)

plt.title("draw_networkx")
nx.draw_networkx(G)

plt.show()
Author: max, 2012-07-14

2 answers

Si usa un gráfico dirigido, entonces el diseño de puntos de Graphviz hará algo como lo que desea con el árbol. Aquí hay un código similar a las soluciones anteriores que muestra cómo hacerlo

import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()

G.add_node("ROOT")

for i in xrange(5):
    G.add_node("Child_%i" % i)
    G.add_node("Grandchild_%i" % i)
    G.add_node("Greatgrandchild_%i" % i)

    G.add_edge("ROOT", "Child_%i" % i)
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i)
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i)

# write dot file to use with graphviz
# run "dot -Tpng test.dot >test.png"
nx.write_dot(G,'test.dot')

# same layout using matplotlib with no labels
plt.title('draw_networkx')
pos=nx.graphviz_layout(G, prog='dot')
nx.draw(G, pos, with_labels=False, arrows=False)
plt.savefig('nx_test.png')

Salida Graphviz

Salida NetworkX / Matplotlib

ACTUALIZADO

Aquí hay una versión actualizada para networkx-2.0 (y con la próxima networkx-2.1 también dibuja flechas).

import networkx as nx
from networkx.drawing.nx_agraph import write_dot, graphviz_layout
import matplotlib.pyplot as plt
G = nx.DiGraph()

G.add_node("ROOT")

for i in range(5):
    G.add_node("Child_%i" % i)
    G.add_node("Grandchild_%i" % i)
    G.add_node("Greatgrandchild_%i" % i)

    G.add_edge("ROOT", "Child_%i" % i)
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i)
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i)

# write dot file to use with graphviz
# run "dot -Tpng test.dot >test.png"
write_dot(G,'test.dot')

# same layout using matplotlib with no labels
plt.title('draw_networkx')
pos =graphviz_layout(G, prog='dot')
nx.draw(G, pos, with_labels=False, arrows=True)
plt.savefig('nx_test.png')

introduzca la descripción de la imagen aquí

 77
Author: Aric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-27 18:17:20

Puede usar pygraphviz para acercarse:

>>> import pygraphviz
>>> import networkx
>>> import networkx as nx
>>> G = nx.Graph()
>>> G.add_node("ROOT")
>>> for i in xrange(5):
...     G.add_node("Child_%i" % i)
...     G.add_node("Grandchild_%i" % i)
...     G.add_node("Greatgrandchild_%i" % i)
...     G.add_edge("ROOT", "Child_%i" % i)
...     G.add_edge("Child_%i" % i, "Grandchild_%i" % i)
...     G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i)

>>> A = nx.to_agraph(G)
>>> A.layout('dot', args='-Nfontsize=10 -Nwidth=".2" -Nheight=".2" -Nmargin=0 -Gfontsize=8')
>>> A.draw('test.png')

Resultado: introduzca la descripción de la imagen aquí

Nota copié las opciones de graphviz del enlace que publicaste arriba. No estoy seguro de por qué el 4to niño se dibuja en la parte superior en lugar de en formato estrictamente vertical. Tal vez alguien que sabe más sobre las opciones de Graphviz puede ayudar con eso.

 6
Author: jterrace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-14 02:19:59