Zum Inhalt

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:

layouter = dsstools.Layouter()
layouter.update_positions("positions.json", graph, seed=12)

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:

layout = dsstools.Layouter().update_positions("positions.json", graph, seed=12)

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:

positions = dsstools.Layouter().read_from_graph(graph)

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:

dsstools.Layouter().write_to_file(positions, "positions.json")