tutorial network library python networkx

python - library - networkx tutorial



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

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 de árbol cuando muestro un gráfico. Estoy usando matplotlib.pylab para trazar la gráfica.

Necesito mostrar los datos en una estructura similar a la que se muestra here . Aunque no tengo subgrafos.

¿Cómo puedo garantizar una estructura como esa?

Ejemplos para los incrédulos:

He podido mostrar los gráficos con pylab y graphviz, pero ninguno de ellos ofrece la estructura de árbol que estoy buscando. He intentado cada diseño que networkx tiene para ofrecer, pero ninguno de ellos muestra una jerarquía . Simplemente no estoy seguro de qué opciones / modo debo darle O si necesito usar pesas. Cualquier sugerencia ayudaría a un montón.

@jterrace:

Aquí hay un resumen aproximado de lo que solía producir las parcelas anteriores. He añadido algunas 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()


Puedes usar pygraphviz para acercarte:

>>> 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:

Tenga en cuenta que copié las opciones de graphviz del enlace que publicó anteriormente. No estoy seguro de por qué el 4to niño está dibujado en la parte superior en lugar de en formato estrictamente vertical. Tal vez alguien que sepa más sobre las opciones de Graphviz pueda ayudar con eso.


Si utiliza un gráfico dirigido, el diseño de puntos de Graphviz hará algo como lo 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'')

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'')