Pakete laden¶
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from math import pi
Definition¶
Das Spiderdiagramm vergleicht Werte von min. drei oder mehr Variablen in Relation zu einem zentralen Punkt. Die Anordnung erinnert an ein Spinnennetz.
Beschreibung¶
Das Netzdiagramm wird auch Spinnennetzdiagramm, Sterndiagramm, Kiviat- oder Radardiagramm genannt - etwas seltener Spider-Grafik. Die Ergebnisse werden dabei grafische in einer Spinnennetzform dargestellt. Besonders gut eignet sich dieses Diagramm zum Visualisieren von Evaluationen für zuvor festgelegte Kriterien zweier (oder mehrerer) Werten mehrerer, gleichwertiger Kategorien.
Für jede Kategorie gibt es eine Achse, dabei gilt bei der Wertigkeit für alle Achsen die gleiche Richtung.
Die Achsen werden kreisförmig in 360 Grad gleichmäßig angeordnet. Die Werte jeder Kategorie sind mit Linien verbunden wie in einem Spinnennetz. Bei mehreren Kategorien werden in der Regel verschiedene Farben verwendet.
Das Sterndiagramm wurde zuerst von Georg von Mayr im Jahr 1877 verwendet.
Voraussetzungen¶
✓ Die Variablen sollten metrisch sein. (In der Praxis werden jedoch oft auch ordinalskalierte Variablen verwendet.)
Gestaltung¶
Anordnung¶
- mindestens 3 Kategorien
- max 10 Achsen
- optimale Anzahl zwischen 5 und 7 Achsen
Gestaltungstips¶
- Achsenbezeichnung
- Farben sinnvoll wählen
- Flächen
Code¶
Allgemein¶
# Spiderdaten
spider = pd.DataFrame({
"Zufriedenheit": [5, 0, 4, 1, 3],
"Produktivität": [5, 0, 5, 2, 3],
"Leistungsbereitschaft": [5, 0, 5, 1, 3],
"Teamplayer": [5, 0, 3, 1, 3],
"Kollegialität": [5, 0, 2, 1, 3]
})
# Kategorien für die Achsen bestimmen
categories = spider.columns.tolist()
labels = categories + [categories[0]] # Ersten Eintrag wiederholen, um das Netz zu schließen
# Werte aus der dritten Zeile (Index 2) entnehmen und den Kreis schließen
values = spider.iloc[2].tolist()
values += values[:1]
# Winkelpositionen für jede Achse berechnen
angles = [n / float(len(categories)) * 2 * pi for n in range(len(categories))]
angles += angles[:1]
# Erstellung des Diagramms mit polarer Achse
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
# Startwinkel auf 90 Grad setzen und Uhrzeigersinn wählen
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)
# Achsenbeschriftung setzen
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
# Skalierung der radialen Achsen (Y-Achse)
ax.set_rlabel_position(0)
ax.set_yticks([1, 2, 3, 4, 5])
ax.set_yticklabels(["1", "2", "3", "4", "5"], color="grey", size=8)
# Werte als Linie und Fläche darstellen
ax.plot(angles, values, linewidth=2, linestyle='solid', label='Frau M.')
ax.fill(angles, values, 'skyblue', alpha=0.4)
# Titel und Legende hinzufügen
ax.set_title("Radar: Zufriedenheit & Co.", size=13, y=1.1)
ax.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))
plt.tight_layout()
plt.show()
# Kategorien aus dem DataFrame entnehmen (Spaltenüberschriften)
categories = list(spider.columns)
# Anzahl der Kategorien (Achsen im Diagramm)
N = len(categories)
# Winkel für jede Kategorie im Kreis berechnen
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1] # Kreis durch Wiederholung des ersten Werts schließen
# Radarplot vorbereiten: polar (rund) anstatt kartesisch (x/y)
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
# Startwinkel auf 90 Grad setzen (obere Achse) und Uhrzeigersinn aktivieren
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)
# Beschriftung der Winkelachsen (die Kategorien)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
# Position und Inhalt der konzentrischen Kreisachsen (Y-Achse / Skala)
ax.set_rlabel_position(0) # Position der Skalenbeschriftung (z. B. oben)
ax.set_yticks([1, 2, 3, 4, 5]) # Skalenwerte
ax.set_yticklabels(["1", "2", "3", "4", "5"], color="grey", size=8) # Skalenbeschriftung
# Farben und Namen für jede dargestellte Person
colors = ['orange', 'blue', 'red']
labels = ['Susi', 'Lisa', 'Mark']
# Schleife über die Zeilen 2–4 im DataFrame (Personendaten)
for i, row in enumerate(spider.iloc[2:].itertuples(index=False)):
values = list(row) # Werte als Liste holen
values += values[:1] # Kreis schließen durch Wiederholung des ersten Werts
ax.plot(angles, values, linewidth=2, linestyle='solid', label=labels[i], color=colors[i]) # Linie zeichnen
ax.fill(angles, values, alpha=0.1, color=colors[i]) # Fläche unter der Linie leicht füllen
# Titel über dem Diagramm platzieren
ax.set_title("Radarplot: Bewertung von Teamfaktoren", y=1.1)
# Legende anzeigen (außerhalb des Plots)
ax.legend(loc='upper right', bbox_to_anchor=(1.1, 1.1))
# Layout optimieren und Plot anzeigen
plt.tight_layout()
plt.show()