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.
"Unterschied 0
und None
"
Um die einzelnen Argumente im Zeichnen besser zu verstehen, gibt es innerhalb von dsstools
eine grundlegende Festlegung:
None
werden denjenigen Knoten/Kanten gegeben, die keinen Wert haben. None
bedeutet, dass beispielweise die Texte der Seite, die gesucht wurden, nicht existieren. Werte, die schlicht keine Treffer erzeugt haben, erhalten hingegen 0
als einen tatsächlichen Wert, der vom Code auch entsprechend verarbeitet wird. Wenn Treffer nicht möglich sind, weil keine Grundmenge vorhanden ist, erhält er None
. Wenn keine Treffer stattfanden, aber eine Grundmenge existiert, erhält man 0
.
Das lässt sich innerhalb des Zeichenmoduls unterschiedlich einsetzen. Dafür nutzt man das fallback
-Argument. So lassen sich beispielsweise Knoten, die keine Werte aufgrund von Fehlern erhalten haben, in Abbildungen ausblenden oder auch durch kräftige Farben hervorstechen lassen.
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.