Zum Inhalt

Mapping

Als Mapping bezeichnen wir das Umwandeln von Attributwerten aus einem Graphen in Farb- und Größenattribute für die grafische Darstellung.

Mappings können auf eine Vielzahl von Elementen angewandt werden:

Insgesamt gibt es 3 Möglichkeiten des Mappings:

  • fixed: Übernimmt einen festgelegten Wert für Farbe oder Größe, also einen float, int oder str. Dieser wird für alle Elementattribute übernommen.
  • qualitative: Damit werden qualitative Attributsausprägungen auf Graphenelemente gemappt. Beispielsweise hat das Attribut "pet" die Ausprägungen "cat", "dog", "mouse". Die Ausprägungen sind unterschiedlich, verfügen allerdings über keine natürliche Rangfolge.
  • sequential: Damit werden sequentielle Attributsausprägungen auf Graphenelemente gemappt. Beispielsweise kann dafür das Degree eines Knoten verwendet werden. Die Ausprägungen sind unterschiedlich, kontinuierlich und besitzen eine natürliche Rangfolge.

Anwendung

Das Mapping steht in engem Zusammenhang mit dem ImageGenerator. Für einen Einstieg in das Zeichnen siehe hier.

Fixe Werte

G = nx.Graph() # (1)
G.add_node("a")
G.add_node("b")
ig = dsstools.ImageGenerator(graph) # (2)

fix = fixed(12) # (3)
ig.nodes.set_sizes(fix) # (4)
  1. Erstellung eines einfachen Graphens.
  2. Erstellung eines ImageGenerators.
  3. Hier wird ein Objekt mit einem fixen Wert von 12 initialisiert und der Variable fix zugewiesen.
  4. Hier wird das Objekt fix den Knoten zugewiesen. Alle Knoten im Netzwerk werden nun mit dem Durchmesser 12 gezeichnet.

Die letzten zwei Zeilen können auch kürzer zusammengefasst werden:

ig.nodes.set_sizes(fixed(12))

Qualitative Werte

G = nx.Graph() # (1)
G.add_node("a", pet="dog") # (2)
G.add_node("b", pet="cat")
ig = dsstools.ImageGenerator(graph) # (3)

qual = qualitative("pet", {"cat": "red", "dog": "green"}) # (4)
ig.nodes.set_colors(qual) # (5)
  1. Erstellung eines einfachen Graphens.
  2. Hier werden Knoten mit Daten erstellt: Der Knoten a hat für das Attribut pet den Wert dog.
  3. Erstellung eines ImageGenerators.
  4. Hier wird ein Objekt mit einem Attributschlüssel ("pet") und einem dict initialisiert, welches die Zuweisung von Wert zu Farbe erhält. Dies wird der Variable qual zugewiesen.
  5. Hier wird das Objekt qual den Knoten des Graphen als Farbe zugewiesen. Alle Knoten im Netzwerk werden nun mit den Farben der Zuweisung aus dem dict gezeichnet.

Auch hier lassen sich die letzten zwei Zeilen kürzer schreiben:

ig.nodes.set_colors(
    qualitative("pet", {"cat": "red", "dog": "green"}
                ) 

Falls ein qualitatives Mapping für Größen verwendet werden soll, so müssen in das dict entsprechend statt der Farben Zahlenwerte eingetragen, die die Größe repräsentieren. Katzenmenschen würden das entsprechend so darstellen:

ig.nodes.set_sizes(qualitative("pet", {"cat": 50, "dog": 5}) 

Sequentielle Werte

G = nx.Graph() # (1)
G.add_node("a") # (2)
G.add_node("b")
ig = dsstools.ImageGenerator(graph) # (3)

sequ = sequential("degree", out_range=(10, 50) ) # (4)
ig.nodes.set_sizes(sequ) # (5)
  1. Erstellung eines einfachen Graphens.
  2. Hier werden Knoten ohne zusätzliche Daten erstellt, da wir bereits vorhandene Attribute des Graphen und seiner Knoten nutzen.
  3. Erstellung eines ImageGenerators.
  4. Hier wird ein Objekt mit einem Attributschlüssel ("degree") und einer out_range initialisiert, welches die im Netzwerk vorhandenen Werte zu einer Größe zuweist. Dies wird der Variable sequ zugewiesen.
  5. Hier wird das Objekt sequ den Knoten zugewiesen. Alle Knoten im Netzwerk werden nun mit den Größen der Zuweisung aus der out_range gezeichnet.

Hinweis

Hier ist die Angabe des "degree" natürlich nicht sonderlich sinnvoll, da keine Kanten im Netzwerk bestehen.

Die Kurzschreibweise sollte jetzt aus den bisherigen Beispielen bekannt sein. Genauso lassen sich sequentielle Werte auf das Farben übertragen. Dann muss allerdings anstatt des Parameters out_range der Parameter cmap (Colormap) verwendet werden. In diesem Fall wählen wir die Colormap viridis:

ig.nodes.set_colors("degree", cmap="viridis")

Farben und Größen können kombiniert werden, sodass sowohl Größe als auch Farbe von Knoten korreliert:

(
    ig.nodes
    .set_colors("degree", cmap="viridis")
    .set_sizes("degree", out_range=(5,50))
)
Für durch das Netz definierte Parameter sind in sequentiellen Mappings folgende Werte erlaubt:

  • "indegree"
  • "outdegree"
  • "degree"
  • "centrality"
  • "betweenness"
  • "closeness"

Darüber hinaus können auch manuell gesetzte Werte verwendet werden:

G = nx.Graph() # (1)
G.add_node("a", rating=3) # (2)
G.add_node("b", rating=7)
G.add_node("c")
ig = dsstools.ImageGenerator(graph) # (3)

ig.nodes.set_sizes(
    ordinal("rating", out_range=(12, 36), fallback=5) # (4)
) 

ig.nodes.set_colors(
    ordinal("rating", fallback="orange", colormap="viridis") # (5)
) 

  1. Erstellung eines einfachen Graphens.
  2. Hier werden Knoten mit Daten erstellt: Der Knoten a hat für das Attribut rating den Wert 3. Auch wird ein Knoten ohne das Attribut rating erstellt (c).
  3. Erstellung eines ImageGenerators.
  4. Hier wird ein Mapping-Objekt mit einem Attributschlüssel rating und einer out_range initialisiert, welches die im Netzwerk vorhandenen Werte zu einer Größe zuweist. Darüber hinaus wird mit fallback ein Standardwert für alle Knoten festgelegt, die nicht über das Attribut verfügen (gilt bspw. für den Knoten c). Alles zusammen wird den Knotengrößen mit ig.nodes.set_sizes() zugewiesen.
  5. Hier wird ein Mapping-Objekt für die Farbe erstellt. Die Vorgehensweise zur darüberliegenden Zeile.