Kann man hierarchische Graphen von networkx in python 3?
Ich versuche, display-ein Baum-graph meiner Klassen-Hierarchie mithilfe networkx.
ich das alles grafisch dargestellt wird, richtig, und es zeigt feine. Aber als einen kreisförmigen Graphen mit kreuzenden Kanten, es ist eine Reine Hierarchie, und es scheint, ich sollte in der Lage sein, um es anzuzeigen als ein Baum.
Habe ich gegoogelt, diese umfassend, und jede angebotene Lösung umfasst die Verwendung pygraphviz
... aber PyGraphviz funktioniert nicht mit Python 3 (Dokumentation aus der pygraphviz Website).
Hat sich schon jemand in der Lage, eine Baum-Diagramm-Anzeige in Python 3?
- Mit networkx Sie sollten in der Lage sein zu verwenden DIGraph mit dem dot-layout. Sollte diese Anzeige einen Baum, graph.
- Die Entwickler-version von pygraphviz funktioniert mit Python 3.
- Sie könnten versuchen, mit dem spring-layout, networkx.spring_layout()
- Ich habe versucht, spring-layout-was zeigt ist immer noch kreisförmig, mit überlappenden Kanten.
- Ich habe eine Antwort, aber es wird nicht besonders schön Aussehen, wenn der Baum einige äste, die sehr "weit". Ich denke, das ist, wo eine Menge der Aufwand, pygraphviz passiert. Lassen Sie mich wissen, wenn es für Sie arbeitet. Wenn nicht, lassen Sie mich wissen, was sieht schlecht über Sie und ich werde sehen, ob es eine einfache Lösung.
- Vielen Dank Joel! Ich werde versuchen diese heute Abend.
- fantastisch! Aber ich wirklich brauchen die Knoten verbreitet wird, und ich versuche, herauszufinden, wo ein eingreifen in den code zu bekommen: wenn nextx eingestellt ist?
- Meine Etiketten sind Klasse Namen, und Sie landen auf der jeweils anderen mit diesem code. Ich möchte Ihnen etwa das doppelte der aktuellen Breite. Ich habe das Spiel mit dx und andere Werte, und bin eine Menge ärger bekommen, dass das passiert. Jede raten, ist willkommen.
- Ich denke das Thema ist zu haben, mehr zu tun mit der änderung der tatsächlichen Breite / Seitenverhältnis der erzeugten Abbildung, eher die Breite, die ich habe. Verdoppelung
width
aber Plotten mit dem gleichen Seitenverhältnis wird am Ende die gleiche scheinbare Breite im Ergebnis der seit es wird nur eine Skala die horizontale Länge entsprechend. Ich denke, es ist irgendwo in rcparams, aber ich nicht oft fiddle, damit Ihr googeln ist so gut wie meine. - in der Tat, ich kann nur die Größe ändern Sie das Fenster und Holen Sie das meiste, was ich brauche. Nochmals vielen Dank für den code: das ist großartig!
- Wenn Sie "akzeptieren" der Antwort würde ich schätzen es. Auch Aric sagt, es pygraphviz scheint zu funktionieren in python 3. Aric sagt, dass der code in seiner Antwort, here funktioniert in python 3. Ich tun, python 2.7, also weiß nicht.
- Ich habe versucht, den code von Aric Antwort, und es blies mich irgendwo in Pygraphviz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bearbeiten (19 Jan 2019) habe ich aktualisiert, der code robuster: Er arbeitet nun für gerichtete und ungerichtete Graphen ohne jegliche änderung, die nicht mehr erfordert, dass der Benutzer geben Sie das root, und es testet, dass der graph ein Baum, bevor er ausgeführt wird (ohne den test hätte es eine unendliche Rekursion - siehe user2479115 Antwort für eine Art und Weise zu behandeln, die nicht mit Bäumen).
Bearbeiten (27 Aug 2018) Wenn Sie möchten, erstellen Sie einen plot mit den Knoten erscheinen als Ringe um den root-Knoten, den code rechts unten zeigt eine einfache Modifikation, dies zu tun
Bearbeiten (17 Sept 2017) ich glaube, die Mühe mit pygraphviz, dass OP hatte, sollte jetzt repariert sein. So pygraphviz ist wahrscheinlich eine bessere Lösung, was ich habe, unter.
Hier ist ein einfaches Rekursives Programm zum definieren der Positionen. Die Rekursion geschieht in
_hierarchy_pos
, das vonhierarchy_pos
. Die Hauptaufgabe derhierarcy_pos
ist noch ein bisschen testen, um sicherzustellen, dass die Grafik angemessen ist, bevor Sie in die Rekursion:und ein Beispiel für die Verwendung:
Idealerweise sollte dies ändern der Skalierung der horizontalen Trennung, basierend auf, wie weit die Dinge unter ihm. Ich bin nicht versuchen, das jetzt.
Radiale expansion
Lassen Sie uns sagen, Sie wollen das Grundstück so Aussehen:
Hier ist der code dafür:
Bearbeiten - Dank Deepak Saini für die Feststellung, dass ein Fehler treten in gerichteten Graphen
neighbors = list(G.neighbors(root))
für python 3.neighbors = G.neighbors(root)
und dann späterif neighbors:
eher alsif len(neighbors)!=0:
funktioniert?neighbors
. Sie müssen möglicherweise einige änderungen an der Positionierung, weil Sie würde haben der Kanten innerhalb einer Hierarchie-Ebene, die führen würde, um eine Reihe von überlappenden Kanten, so wäre es schwer zu sagen, welche Knoten tatsächlich angeschlossen sind.Hier ist eine Lösung für große Bäume. Es ist eine Abwandlung von Joel rekursive Ansatz, der gleichmäßig Räumen Knoten auf jeder Ebene.
Joel ' s z.B. wie folgt Aussehen wird:
- Und dies ist ein komplexer graph (gerendert mit plotly):
neighbors = G.neighbors(node)
mitneighbors = list(G.neighbors(node))
dies funktioniert in Python 3.Ich leicht modifiziert, so dass es nicht unendlich recurse.
Der einfachste Weg, um eine gut aussehende Baum-Diagramm-Anzeige in Python 2 oder 3 ohne PyGraphviz ist die Verwendung PyDot (https://pypi.python.org/pypi/pydot). In der Erwägung, dass PyGraphviz bietet eine Schnittstelle, um das ganze von Graphviz, PyDot stellt nur eine Schnittstelle zur Graphviz Dot Werkzeug, das ist das einzige, das Sie brauchen, wenn das, was Sie suchen, ist ein hierarchischer graph /Baum. Wenn Sie möchten, erstellen Sie Ihr Diagramm in NetworkX eher als PyDot, können Sie mit NetworkX zu exportieren PyDot graph, wie in der folgenden:
Beachten Sie, dass Graphviz und PyDot installiert werden müssen für die oben genannten, um korrekt zu arbeiten.
Achtung: ich habe Probleme bei der Verwendung von PyDot zeichnen von Graphen mit Knoten-Attribut exportierte Wörterbücher aus NetworkX - manchmal sind die Wörterbücher scheinen exportiert werden mit Anführungszeichen fehlen von Zeichenfolgen, die bewirkt, dass die
write
Methode zum Absturz zu bringen. Dies kann vermieden werden, durch weglassen der Wörterbücher.Für einen gerichteten Graphen, Da die Nachbarn(x) sind nur die succesors(x), so müssen Sie die Zeilen:
Auch eine bessere Möglichkeit wäre diese: