web-dev-qa-db-fra.com

Existe-t-il un moyen de garantir une sortie hiérarchique de NetworkX?

J'essaie de produire un organigramme d'une structure d'arbre . J'ai été en mesure de créer des graphiques représentatifs avec networkx, mais j'ai besoin d'un moyen de montrer la structure de l'arborescence lorsque je génère un tracé. J'utilise matplotlib.pylab pour tracer le graphique.

J'ai besoin de montrer les données dans une structure similaire à ce qui est montré ici . Bien que je n'ai pas de sous-graphiques.

Comment puis-je garantir une telle structure?

Exemples pour les incroyants:

Various NetworkX layouts

J'ai pu montrer les graphiques avec pylab et graphviz, mais aucun n'offre la structure arborescente que je recherche. J'ai essayé toutes les mises en page que networkx a à offrir, mais aucune d'entre elles n'a de hiérarchie . Je ne sais juste pas quelles options/mode lui donner [~ # ~] ou [~ # ~ ] si j'ai besoin d'utiliser des poids. Toutes les suggestions aideraient un tas.

@jterrace:

Voici un aperçu de ce que j'ai utilisé pour produire les graphiques ci-dessus. J'ai ajouté quelques étiquettes, mais à part ça, c'est la même chose.

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()
65
max

Si vous utilisez un graphique dirigé, la disposition des points Graphviz fera quelque chose comme vous le souhaitez avec l'arborescence. Voici un code similaire aux solutions ci-dessus qui montre comment le faire

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

Graphviz output

NetworkX/Matplotlib output

[~ # ~] mis à jour [~ # ~]

Voici une version mise à jour pour networkx-2.0 (et avec les flèches à venir networkx-2.1 aussi).

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

enter image description here

93
Aric

Vous pouvez utiliser pygraphviz pour vous rapprocher:

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

Résultat: enter image description here

Remarque J'ai copié les options de graphviz à partir du lien que vous avez publié ci-dessus. Je ne sais pas pourquoi le 4ème enfant est dessiné sur le dessus plutôt que dans un format strictement vertical. Peut-être que quelqu'un qui en sait plus sur les options de Graphviz peut vous aider.

7
jterrace