Python, Jupyter und die UK General Election 2019

In diesem Tutorial dreht sich alles um die Wahlen im Vereinigten Königreich vom 12. Dezember 2019. Zu welcher Sitzverteilung das Ergebnis dieser Wahl im House of Commons führte, soll mithilfe von Python visualisiert werden. Als Code-Editor nutze ich Visual Studio Code.

Es ist das dritte Balkendiagramm-Beispiel. Den Code zu den vorherigen Beispielen finden sich unter folgenden Links:

Fangen wir an. Auf Eurem System müssen folgende Bibliotheken installiert sein:

  • jupyter
  • requests
  • matplotlib
  • pprint (optional)

Visual Studio Code und Jupyter Notebook

Visual Studio Code bietet mittlerweile eine sehr gute Unterstützung für Jupyter Notebook, das freilich mittels der Anweisung

$ pip install jupyter  # Windows

oder

$ pip3 install jupyter  # Linux/macOS

auf Eurem System installiert sein muss.

Startet dann Visual Studio Code und öffnet mit shift + cmd + p die Command Palette. Um mit einem neuen Notebook zu beginnen, muss dann

Python: Create New Blank Jupyter Notebook

ausgeführt werden.

Datensatz mit requests abrufen

Der Code zum Abrufen des JSON-Datensatzes sieht nun folgendermaßen aus:

import requests
import matplotlib.pyplot as plt
from pprint import pprint

URL = "https://xern-statistic.de/api/election"

def fetch_json_data(json_url):
# Connect to the server
try:
    response = requests.get(json_url)
except OSError as e:
    print("Error: {0}".format(e))
    return None

# Check if the status code is OK
# and receive data
if response.status_code == 200:
    print("Status 200, OK")
    return response.json()
else:
    print("JSON data request not successfull!")
    return None

json_data = fetch_json_data(URL)
pprint(json_data)

Ich erspare mir an dieser Stelle eine ausführliche Erklärung des Codes und verweise stattdessen auf meine bisherigen Blog-Beiträge zu CSV-Dateien, JSON und Python.

Ein Klick auf das Play-Symbol ▷ führt den Code, was — im Idealfall — die aktuelle Sitzverteilung zeigt:

Status 200, OK
{'Brexit Party': 0,
 'Conservative Party': 365,
 'Democratic Unionist Party': 8,
 'Green Party': 1,
 'Labour Party': 203,
 'Liberal Democrats': 11,
 'Other Parties': 3,
 'Plaid Cymru': 4,
 'Scottish National Party': 48,
 'Sinn Féin': 7,
 'UK Independence Party': 0}

Es handelt sich hierbei um ein Dictionary. Sowohl die Schlüssel (Parteien), als auch die Werte (Sitze) werden nun jeweils zu einer Liste konvertiert:

# list of parties
parties = list(json_data.keys())
print(parties)

['Conservative Party', 'Labour Party', 'Scottish National Party', 'Liberal Democrats', 'Democratic Unionist Party', 'Sinn Féin', 'Plaid Cymru', 'Green Party', 'Brexit Party', 'UK Independence Party', 'Other Parties']

# list of seats
seats = list(json_data.values())
print(seats)

[365, 203, 48, 11, 8, 7, 4, 1, 0, 0, 3]

Daten mit matplotlib visualisieren

Als nächstes geht es an die Visualisierung mithilfe von matplotlib. Wiederum verzichte ich auf eine Erklärung des Codes und verweise auf dieses Beispiel.

fig, ax = plt.subplots()

y_pos = np.arange(len(parties))
color = ['#3D81CB', '#B90E00', '#F8E900', '#E09000', '#7E0700', '#306A18', '#528F2B', '#55B728', '#52BDD0', '#BDBDBD', '#767676']

plt.title('UK General Election 2019')
plt.ylabel('Seats')
plt.xlabel('Parties')
plt.bar(y_pos, seats, align='center', alpha=0.6, color=color)

ax.set_xticks(range(len(parties)))
ax.set_xticklabels(parties, rotation='vertical')

Jupyter Notebook in eine Python-Datei konvertieren

Visual Studio Code ermöglicht die Umwandlung einer ipynb-Datei in eine py-Datei. Dazu klickt Ihr einfach auf das Symbol ganz rechts in der Menüleiste (siehe Abbildung).

Save Jupyter Notebook as Python file in VSCode

Dem so gespeicherten Python-Skript kann man dann noch ein

plt.show()

spendieren, was zur Folge hat, dass ein neues Fenster mit der Darstellung des Balkendiagramms geöffnet wird.

Den vollständigen Code findet Ihr — als Python-Datei — zum Download bei Github. Dort habe ich auch noch Code für die Balkenbeschriftung ergänzt, ähnlich wie in dem Balkendiagramm-Beispiel zur Élection présidentielle 2017.

Weitere Python-Beispiele