9.3 Visualisierung von DataFrames mit Fehlerbalken#

Lernziele#

Lernziele

  • Sie können den Zeilenindex .index und den Spaltenindex .columns aus einem DataFrame extrahieren.

  • Sie können den Text der Achsenbeschriftung drehen.

  • Sie können mit axhline() zu einem Plot eine horizontale Linie hinzufügen.

  • Sie können Fehlerbalken mit errorbar() visualisieren.

Visualisierung von DataFrames#

Aber wie kombinieren wir jetzt die Funktionalitäten des Pandas-Moduls mit denen des Matplotlib-Moduls? Der grundlegende Datentyp für Matplotlib ist das NumPy-Array und auch in den Pandas-Datenobjekten stecken im Kern NumPy-Arrays. Daher funktionieren die Plotting-Funktionalitäten von Matplotlib direkt. Wünschenswert wäre allerdings, den Zeilen- oder den Spaltenindex für die Beschriftung zu nehmen. Beides ist in dem DataFrame-Objekt abgespeichert. Wir können mit

  • .index auf den Zeilenindex und

  • .columns auf den Spaltenindex

zugreifen. Übrigens, .values liefert die Werten in der Tabelle als NumPy-Array zurück. Aber das brauchen wir für die Visualisierung nicht, denn die Tabellendaten können direkt viualisiert werden.

Wir verwenden wieder einen realistischen Datensatz und importieren den uns schon bekannten Datensatz der Top7-Fußballvereine der Bundesliga 2020/21 (→ Download). Dann lassen wir den Zeilen- und Spaltenindex direkt anzeigen:

import pandas as pd

data = pd.read_csv('bundesliga_top7_offensive.csv', index_col=0)

print('Zeilenindex: ')
print(data.index)

print('Spaltenindex:')
print(data.columns)
Zeilenindex: 
Index(['Manuel Neuer', 'Thomas Müller', 'David Alaba', 'Jérôme Boateng',
       'Robert Lewandowski', 'Joshua Kimmich', 'Kingsley Coman',
       'Benjamin Pavard', 'Alphonso Davies', 'Serge Gnabry',
       ...
       'Petar Musa', 'Florian Hübner', 'Cedric Teuchert', 'Keita Endo',
       'Niko Gießelmann', 'Loris Karius', 'Akaki Gogia', 'Leon Dajaku',
       'Tim Maciejewski', 'Joshua Mees'],
      dtype='object', name='Name', length=177)
Spaltenindex:
Index(['Club', 'Nationality', 'Position', 'Age', 'Matches', 'Starts', 'Mins',
       'Goals', 'Assists', 'Penalty_Goals', 'Penalty_Attempted', 'xG', 'xA',
       'Yellow_Cards', 'Red_Cards'],
      dtype='object')

So kann man direkt die Daten aus einem Pandas-DataFrame extrahieren und visualisieren. Wenn wir beispielsweise wissen wollen, wie alt die Spieler der Eintracht Frankfurt sind, filtern wir zuerst. Danach stellen wir auf der x-Achse die Namen der Spieler (= Zeilenindex) dar und auf der y-Achse das Alter (‘Age’). Da es sich bei den Spielern um Kategorien, also diskrete Daten handelt, verwenden wir ein Balkendiagramm.

import matplotlib.pyplot as plt

# data
filter = data.loc[:, 'Club'] == 'Eintracht Frankfurt'
data_eintracht_frankfurt = data.loc[filter, :]
x = data_eintracht_frankfurt.index
y = data_eintracht_frankfurt.loc[:, 'Age']

# plot
plt.figure()
plt.bar(x,y)
plt.xlabel('Spieler')
plt.ylabel('Alter')
plt.title('Spielerdaten Eintracht Frankfurt 20/21');
../_images/2899cdd6f381220c9a2c6e30ad0187dae9c774df9407bc201c7832e62967d276.png

Leider kann man die Spielernamen nicht mehr lesen. Wir können händisch in das Styling der x-Achsenbeschriftung eingreifen und die die Beschriftung um 45 Grad drehen. Dann sieht der Code folgendermaßen aus:

# plot
plt.figure()
plt.bar(x,y)
plt.xlabel('Spieler')
plt.ylabel('Alter')
plt.title('Spielerdaten Eintracht Frankfurt 20/21')

# Rotation der xticks um 45 Grad und horizontal alignment rechts
plt.xticks(rotation = 45, ha='right');
../_images/d2da94da042ddfd3a4ebc57441976b1bbd515c4fc98589dab96fe14b00f1a05e.png

Mini-Übung

Visualisieren Sie die Anzahl der Minuten, die ein Spieler der Eintracht Frankfurt auf dem Platz stand. Beschriften Sie auch x- und y-Achse und geben Sie der Grafik einen aussagekräftigen Titel.

# Hier Ihr Code

Lösung

# data
x = data_eintracht_frankfurt.index
y = data_eintracht_frankfurt.loc[:, 'Mins']

# plot
plt.figure()
plt.bar(x,y)
plt.xlabel('Spieler')
plt.xticks(rotation = 45, ha='right')
plt.ylabel('Minuten')
plt.title('Spielerdaten Eintracht Frankfurt 20/21');

Plot vom Mittelwert als horizontale Linie#

Als nächstes möchten wir in den Plot Zusatzinformationen mit einblenden. So würden wir gerne sichtbar machen, wo das Durchschnittsalter der Fußballspieler liegt. Dadurch können wir schnell ablesen, welcher Spieler über dem Durchschnitt liegt und welcher jünger als der Durchschnitt ist.

Dazu müssen wir zunächst die Zusatzinformation aus den Daten herausholen, sprich den Mittelwert des Alters berechnen lassen.

mittelwert_alter = data_eintracht_frankfurt.loc[:, 'Age'].mean()
print(f'Mittleres Alter der Spieler: {mittelwert_alter}')
Mittleres Alter der Spieler: 26.12

Und nun ergänzen wir den Plot der Altersangaben mit dem Mittelwert. Dazu zeichnen wir eine horizontale Linie mit der Höhe des Altersdurchschnitts. Dazu verwenden wir die Funktion axhline().

# Daten
x = data_eintracht_frankfurt.index
y = data_eintracht_frankfurt.loc[:, 'Age']

# Visualisierung
plt.figure()
plt.bar(x,y)
plt.xlabel('Spieler')
plt.ylabel('Alter')
plt.title('Spielerdaten Eintracht Frankfurt 20/21');

# Rotation der xticks um 45 Grad und horizontal alignment rechts
plt.xticks(rotation = 45, ha='right')

# horizontale Linie
plt.axhline(mittelwert_alter, color='red');
../_images/67fce2d8d81238837407ab3f1d87ac4442b1cc110ccddc099063d4af5641773e.png

Mini-Übung

Bilden Sie jetzt den Mittelwert der Minuten, die ein Spieler der Eintracht Frankfurt durchschnittlich im Einsatz war. Ergänzen Sie Ihren Plot der letzten Mini-Übung um eine horizontale schwarze Linie, die den Mittelwert visualisiert.

# Hier Ihr Code

Lösung

x = data_eintracht_frankfurt.index
y = data_eintracht_frankfurt.loc[:, 'Mins']
min_durchschnitt = y.mean()

# plot
plt.figure()
plt.bar(x,y)
plt.axhline(min_durchschnitt, color='black')
plt.xlabel('Spieler')
plt.xticks(rotation = 45, ha='right')
plt.ylabel('Minuten')
plt.title('Spielerdaten Eintracht Frankfurt 20/21');

Plot der Standardabweichung als Fehlerbalken#

Bei allen Messungen treten Messfehler auf. Manchmal weiß man von Anfang an, welchen Messfehler das Messgerät hat. Ein anderes Mal hat man beispielsweise eine Messung zehnmal wiederholt und möchte nun den Mittelwert als Datenpunkt und die Standardabweichung der Messergebnisse als Fehlerbalken visualisieren. Durch die Angabe eines Fehlerbalkens kann man dem Betrachter eine Zusatzinformation mitteilen. Für die Darstellung von Fehlerbalken stellt das Matplotlib-Modul die Methode errorbar() zur Verfügung. Mehr Informationen gibt es auf der Hilfeseite

# data
x = data_eintracht_frankfurt.index
y = data_eintracht_frankfurt.loc[:, 'Age']
standardabweichung_alter = data_eintracht_frankfurt.loc[:, 'Age'].std()

# plot data
plt.figure()
plt.errorbar(x, y, yerr=standardabweichung_alter)

# styling
plt.xlabel('Spieler')
plt.xticks(x, rotation = 45, ha='right')    # um 45 Grad
plt.ylabel('Alter')
plt.title('Spielerdaten Eintracht Frankfurt 20/21');
../_images/4c0c387e5cf136deb7891b82e8f990fb268f63bda59e2eea6acbf3b2a46c562b.png

Die Grafik sieht irritierend aus, da die Altersangben der Spieler verbunden wurden. Ästhetischer und besser interpretierbar wird die Grafik, wenn wir noch ein wenig an den Optionen herumschrauben. Mit der Formatierung fmt='o' werden die Messwerte als Kreise dargestellt.

# data
x = data_eintracht_frankfurt.index
y = data_eintracht_frankfurt.loc[:, 'Age']
standardabweichung_alter = data_eintracht_frankfurt.loc[:, 'Age'].std()

# plot data
plt.figure()
plt.errorbar(x, y, yerr=standardabweichung_alter, fmt='o')

# styling
plt.xlabel('Spieler')
plt.xticks(x, rotation = 45, ha='right')    # um 45 Grad
plt.ylabel('Alter')
plt.title('Spielerdaten Eintracht Frankfurt 20/21');
../_images/4f02cf5aab05746ee6baa0563d9ae1eb590d547ea2a5f3261dd9f9fbaac98b6e.png

Mini-Übung

Lassen Sie nun die Standardabweichung der Minuten visualisieren, die ein Spieler der Eintracht Frankfurt durchschnittlich im Einsatz war.

# Hier Ihr Code

Lösung

x = data_eintracht_frankfurt.index
y = data_eintracht_frankfurt.loc[:, 'Mins']
min_standardabweichung = y.std()

# plot
plt.figure()
plt.errorbar(x,y, yerr=min_standardabweichung, fmt='o')
plt.xlabel('Spieler')
plt.xticks(rotation = 45, ha='right')
plt.ylabel('Minuten')
plt.title('Spielerdaten Eintracht Frankfurt 20/21');

Zusammenfassung und Ausblick#

Nachdem wir uns erarbeitet haben, wie Daten aus einem DataFrame für eine Visualisierung mit Matplotlib aufbereitet werden, lernen wir im nächsten Abschnitt noch einen weiteren Diagrammtyp kennen, das Histogramm.