Positionierung
Bevor wir eine Abbildung zeichnen können, müssen die Positionen der Knoten
unseres Netzwerkes festgelegt werden. Dazu gibt es derzeit zwei Varianten:
Standard (nutzt intern nx.spring_layout()
) und Graphviz
.
Erstere Variante ist automatisch mit der Installation von dsstols
verfügbar.
Zweitere Variante ist komplizierter zu installieren, liefert aber eine
(subjektiv) bessere Positionierung.
Standard (einfach)
Überblickshaft ein Beispiel, wie die sogenannte Layouter-Klasse verwendet wird, in welchem die Positionen festgelegt werden:
Zuerst wird ein Objekt layouter
erstellt, welches mittels der Methode
update_positions()
den Pfad für eine Datei übergibt, in die alle
Positionen geschrieben werden, den Graphen selbst und einen sogenannten
Seed.
Der Seed (in diesem Fall 12) legt die Zufälligkeit der entstehenden Positionen fest und determiniert das Netzwerk. Falls du unterschiedliche Positionen probieren willst, kansnt du über den Seed iterieren (bspw. mithilfe einer Range und eines For-Loops). Die obige Zeilen lässt sich auch kürzer schreiben:
In der Variable layout
findet sich in der Folge ein Dictionary,
welches für das Zeichnen übergeben werden kann (siehe dazu unten).
Graphviz (fortgeschritten)
Graphviz
liefert schönere Ergebnisse in der Positionierung, ist
allerdings etwas schwieriger zu installieren. Dazu muss Graphviz oder
pygraphviz installiert sein. Hier
wird die Installation von Graphviz erklärt. Zusätzlich kannst du auch
die Python-Anbindung pygraphviz
installieren (Erklärung
hier,
du benötigst aber dennoch Graphviz
.)
Wenn du das geschafft hast, kannst du den graphviz
Layouter auswählen
und darüber deine Positionen festlegen lassen:
positions = dsstools.Layouter().select("graphviz").update_positions("positions.json", graph, seed=12)
Falls eine andere Layout-Engine verwendet werden soll (beispielweise bei
großen Netzwerken), kann diese über den Parameter prog
übergeben
werden:
positions = (
dsstools.Layouter()
.select("graphviz")
.update_positions("positions.json", graph, seed=12, prog="fdp")
)
Für eine Übersicht der verfügbaren Layout-Engines innerhalb von Graphviz siehe hier.
Achtung
Der Seed für Graphviz ist nicht deterministisch (auf unterschiedlichen Systemen kommen unterschiedliche Ergebnisse zustande, auch wenn dieselben Argumente übergeben werden). Deshalb funktioniert die Zwischenspeicherung der Positionen auf unterschiedlichen Rechnern immer über die Positionsdatei.
Hinweis
Beide Varianten nutzen ein Argument für den Ort und Name der
Positionsdateien, in den Beispielen immer "positions.json"
. Meine
Empfehlung ist es, wenn du dich auf eine Positionierung festgelegt hast,
diese Datei mit in eure Versionskontrolle aufzunehmen, um euer Setup
auch Anderen im Team zur Verfügung stellen zu können oder eine Historie
eurer Positionen zu haben. Somit sollte euer Pfad für die Positionsdatei
innerhalb eures Repositories liegen.
Import aus dem Graphen selbst
Es besteht ebenfalls die Möglichkeit, über importierte Knotenattribute die Positionen festzulegen:
Falls diese Positionen auch in einer Datei gespeichert werden sollen, so lassen sie sich wie folgt in die Datei positions.json
im selben Verzeichnis schreiben: