gluecko.se


Corona-Daten des RKI mit Python visualisieren

Im letzten Post hatte ich bereits angekündigt, dass ich aktuell daran arbeite Daten vom RKI mit Python abzuziehen, diese mit Plotly grafisch aufzubereiten und schließlich jeden Morgen in einen Telegram-Kanal zu senden.

Heute werde ich euch zeigen, wie ich die heruntergeladenen Daten mit plotly in Python visualisiere.



Auch dafür bereiten wir zunächst das Skript vor, indem wir die notwendigen Abhängigkeiten laden. Falls euch etwas fehlt, könnt ihr es in der Regel mittels pip install <name> jederzeit installieren.

  • os und pandas benutzen wir erneut, um die zuvor exportierten Daten einzulesen und entsprechend aufzubereiten
  • mit plotly.graph_objects werden wir die Visualisierung erzeugen
  • und kaleido.scopes.plotly hilft uns die eigentlich interaktive Grafik von Plotly als statische Datei zu exportieren
#imports
import os
import pandas as pd
import plotly.graph_objects as go
import requests

from kaleido.scopes.plotly import PlotlyScope

Mit der Hilfe von os.path.abspath() defineren wir uns die Arbeitspfade. Gehen wir davon aus, dass sich in dem Verzeichnis, in dem unser Python-Skript liegt, auch die Unterordner data/ und img/ befinden. Aus ersterem wollen wir später die Datei rki.csv laden. In letzteres den fertigen Plot speichern.

Außerdem, sollten wir ein paar Farben festlegen.

# define working paths
app_dir = os.path.abspath(os.path.dirname(__file__))
data_dir = app_dir + '/data/'
img_dir = app_dir + '/img/'

# define colors
spaetzle_gelb_light = 'rgb(255,254,249)'
spaetzle_gelb_dark = 'rgb(145,113,5)'
light_grey = 'rgb(204, 204, 204)'

Laden wir die CSV-Datei und schränken sie auf den/die für uns relevanten Landkreis/e ein.

# import as Pandas data frame and restrict to county "Stuttgart"
rki = pd.read_csv(data_dir + "rki.csv", sep = ";")
df_str = rki.loc[rki.GEN == "Stuttgart"]
df_str.head()

Jeder plotly-Plot beginnt mit fig = go.Figure(). An fig werden dann weitere Elemente angefügt.

  • Beginnen wir damit ein Liniendiagramm hinzuzufügen (add_trace(go.Scatter()))
  • Dieses soll auf der x-Achse die Zeit zeigen (x = df_str.last_update)
  • Und auf der y-Achse die 7-Tage-Inzidenz pro 100.000 Einwohner (y = df_str.cases7_per_100k)
  • Die einzelnen Punkte sollen mit der (gerundeten) Inzidenz beschriftet werden (text = df_str.cases7_per_100k.round())
  • Angezeigt werden soll eine Linie, ein Marker und die Beschriftung (mode="lines+markers+text")
  • Außerdem wollen schwäbische Farben, also Spätzegelb verwenden
# create plot
fig = go.Figure()
fig.add_trace(go.Scatter(
    x = df_str.last_update,
    y = df_str.cases7_per_100k,
    text = df_str.cases7_per_100k.round(),
    mode="lines+markers+text",
    textposition="top center",
    textfont_color=spaetzle_gelb_dark,
    line=dict(color = spaetzle_gelb_dark,
))

Corona Inzidenz

Schon ganz nett, aber layout-technisch geht da noch was.

  • Geben wir dem Plot einen Titel (title = '7-Tage Inzidenz pro 100k Einwohner: Stuttgart') in der richtigen Farbe (title_font_color=spaetzle_gelb_dark)
  • Die x-Achse wollen wir dezent in grau zeigen (xaxis = dict())
  • Die y-Achse brauchen wir gar nicht (yaxis = dict())
  • Als Hintergrundfarbe wollen wir spätzle-gelb (plot_bgcolor, paper_bgcolor)
  • Und eine Legende brauchen wir auch nicht (showlegend = False)
  • Um Missverständnissen vorzubeugen wollen wir außerdem, dass die y-Achse nicht abgeschnitten wird (vor allem, da wir sie ausgeblendet haben). Mit update_yaxes(rangemode = 'tozero') sorgen wir dafür, dass die y-Achse immer bei null beginnt.
# make layout great again!
fig.update_layout(
    title = '7-Tage Inzidenz (100k EW): Stuttgart',
    title_font_color=spaetzle_gelb_dark,
    xaxis=dict(
        showline=True,
        showgrid=False,
        showticklabels=True,
        linecolor=light_grey,
        color = light_grey,
        linewidth=2,
        ticks='outside', 
    ),
    yaxis=dict(
        showgrid=False,
        zeroline=False,
        showline=False,
        showticklabels=False,
    ),
    plot_bgcolor=spaetzle_gelb_light,
    paper_bgcolor=spaetzle_gelb_light,
    showlegend=False,
)
fig.update_yaxes(rangemode = 'tozero')

Corona Inzidenz (mit abgeschnittener y-Achse)

Corona Inzidenz (y-Achse beginnt bei null)

Diese Grafik sollten wir jetzt noch abspeichern, damit wir sie im nächsten Schritt in einen Telegram-Kanal senden können.

# export plotly as png
scope = PlotlyScope()
with open(img_dir + "figure.png", "wb") as f:
    f.write(scope.transform(fig, format="png"))


telegram python open-source bot corona


Logo
soeren

Data Nerd 🤓 | begeistert vor allem von ausgefallenen Visualisierungen 📊 mit R und Python 🐍 | Außerdem: Serienjunkie 📺, Kaffeetrinker ☕️, #36C3, 100% Ökostrom 💡 | Aktuell in Stuttgart daheim.


Das könnte dich auch interessieren ...

  • Corona-Daten des RKI mit Python herunterladen
    Auch Ende 2020 hält uns Corona fest im Griff. Vor allem vor den Feiertagen habe ich mir die Frage gestellt, wie sinnvoll es ist, wenn Personen aus unterschiedlichen Landesteilen zusammenkommen. Ich wo...
  • OSM Daten als SVG exportieren
    OSM2XML Ich möchte euch heute ein cooles Projekt vorstellen. Der Hase nutzt die Zeit während seines Spezialprojektes sehr effektiv und hat am Wochenende ein Python-Projekt auf GitHub geladen. Mit dem ...
  • Etwas coolere ggplots erstellen
    TidyTuesday Baden-Württemberg Leider muss ich zugeben, dass meine bisherige Beteiligung am TidyTuesday weit hinter meinen Erwartungen zurück geblieben ist. Bisher habe ich lediglich einmal mitgemacht ...
  • Hugo mit Git auf dem uberspace nutzen
    Vorgeschichte Vor gar nicht allzu langer Zeit bin ich mit diesem Blog von Ghost zu Jekyll gewechselt. Ghost hat mir eigentlich sehr gut getaugt, auch wenn ich nicht der größte Fan davon war, dass blog...
  • Komplexe CSV-Dateien einlesen
    Natürlich gibt es einfachere Dinge, als Daten in R einzulesen. Und trotzdem ist es zumindest seit der Einführung des tidyverse und den damit propagierten tidy data principles sehr viel einfacher gewor...

Zeit für deinen Senf ...


© 2021 gluecko.se - CC BY-SA 4.0 - RSS
build with 💚 and Hugo, hosted on uberspace