# Importiere die benötigten Abhängigkeiten. Neben dsstools benötigen wir auch NetworkX,
# ein Package für die Verwendung von Graphen, auf dem dsstools aufbaut.
# Beide werden mit einem Alias importiert
import networkx as nx
import dsstools as dts

# Lese einen Graphen mithilfe von NetworkX ein. Mit diesem Graphen werden wir
# weiterarbeiten.
graph = nx.read_gexf("./example_graph.gexf")

# Erzeuge ein Layouter-Objekt. Mit diesem können wir Positionen mit unserem Graphen
# generieren. Bei der Generierung werden diese Positionen auch in die Datei
# `positions.json` gespeichert. Das hat den Zweck, dass man immer die gleichen
# Positionen erhält.
layouter = dts.Layouter()
positions = layouter.read_or_create_layout("positions.json", graph, seed=1234, k=1)

# Erzeuge ein ImageGenerator-Objekt. Ein ImageGenerator erzeugt mit einem Graph und
# verschieden Einstellungen eine (!) Abbildung.
image_generator = dts.ImageGenerator(graph)

# Setze die Positionen im ImageGenerator.
image_generator.nodes.set_positions(positions)

# Lege die Farben für die Kanten fest.
image_generator.edges.set_colors(dts.fixed("grey"))

# Lege die Farben für die Knoten fest. Wir nutzen ein qualitatives Mapping. Das
# bedeutet, dass mehrere Kategorien unterschiedliche eingefärbt werden.
image_generator.nodes.set_colors(dts.qualitative("stage_of_sf", cmap="Set2"))

# Lege die Knotengröße fest. Wir nutzen ein sequentielles Mapping. Das bedeutet, dass
# kontinuierliche Werte auf eine von uns gewählte Skala übertragen werden (`out_range`).
# In diesem Fall würde also das geringste Degree den Knotenradius 5, das höchste Degree
# im Netzwerk den Knotenradius 500 bedeuten.
image_generator.nodes.set_sizes(dts.sequential("degree", out_range=(5, 500)))

# Wir zeichnen und schreiben die Datei. Zeichnen und Schreiben finden getrennt statt, da
# es möglich ist, eine Abbildung in mehreren Ebenen zu komponieren.
image_generator.draw().write_file("./abbildung.svg")
