Zeichnen
Die neue Variante des Zeichnen versucht, die vielen und komplexen
Argumente, die für eine erfolgreiche Darstellung an die
draw
-Funktionen übergeben werden müssen, zu reduzieren. Stattdessen
sollen sukzessive Einstellungen in einem Objekt konfiguriert werden,
um so gesehen eine Abbildung zu komponieren. Dafür nutzen wir
sogenanntes method chaining.
Beispielhaft könnte das so aussehen:
ig = dts.ImageGenerator(graph) # (1)
ig.nodes.set_colors(dts.fixed("blue")) # (2)
ig.nodes.labels.set_labels({n: n for n in graph}) # (3)
ig.description.set_text("Eine Beschreibung") # (4)
ig.edges.set_colors(fixed("grey")) # (5)
(
ig.
.draw_edges() # (6)
.draw_nodes()
.draw_labels()
.draw_description()
.write_file("meine_abbildung.svg") # (7)
) # (8)
- Initialisierung eines ImageGenerator-Objektes und Zuweisung zu
ig
. - Einstellung der Farbe der Knoten.
- Einfügen aller Labels in das Objekt.
- Einfügen der Beschreibung.
- Einstellung der Farbe der Kanten.
- Zeichnen der einzelnen Elemente durchführen. Zuerst die Kanten, dann die Knoten, dann die Labels und zuletzt die Beschreibung.
- Zuletzt wird die Abbildung in eine Datei geschrieben.
- Für diese mehrzeilige Aneinanderkettung von Methodenaufrufen muss der gesamte Aufruf in einfache Klammern geschrieben werden.
Die Teile der Abbildung werden einzeln und nacheinander gezeichnet, deshalb auch diese Reihenfolge. Als Erstes kommen die Kanten, dann die Knoten, darüber die Labels und schließlich die Beschreibung an der unteren Kante. Diese so geschaffene Abbildung ist allerdings nur ausschließlich im Arbeitsspeicher vorhanden und muss noch lokal gespeichert werden. Dazu nutzen wir den Aufruf in (7).
Warnung
Für die Aneinanderkettung über mehrere Zeilen in Python müssen um den gesamten Ausdruck runde Klammern gesetzt werden.
Komplexere Abbildungen
Method chaining ermöglicht auch komplexeres Komponieren von Abbildungen, was insbesondere dann relevant wird, wenn mehrere Abbildungen mit leichten Unterschieden gezeichnet werden sollen. Nehmen wir beispielhaft an, du möchtest zwei Abbildungen zeichnen, auf denen jeweils das Degree dargestellt wird.
Dazu legen wir als Erstes eine Standard-Einstellung an:
ig = dsstools.ImageGenerator(graph)
ig.nodes.set_positions("./positions.json").set_colors(fixed("green"))
ig.edges.set_colors("darkgrey")
Die Positionen, Kanten- und Knotenfarbe soll dabei über alle Abbildungen
konstant sein. Das schreiben wir in das Objekt ig
. Dieses
rufen wir im Folgenden erneut auf:
ig.nodes.set_sizes("degree")
(
ig
.draw_nodes()
.draw_edges()
.write_file("img/degree.svg")
)
ig.nodes.set_sizes("indegree")
(
ig
.draw_nodes()
.draw_edges()
.write_file("img/indegree.svg")
)
Hier nutzen wir zweimal das Objekt ig
und setzen die
Nodesizes jeweils auf degree
bzw. indegree
. Auch die Dateinamen
werden ebenfalls entsprechend angepasst.
Hinweis
Knoten und Kanten müssen nach der Einstellung neu gezeichnet werden. Kanten benötigen die Größe der Knoten, um den Pfeil am Ende korrekt positionieren zu können.
Komplexe Farbwahl
Für Komplexe Farbeinstellungen siehe hier.