Matplotlib Zeitlinienvisualisierungen erstellen

PythonPythonBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernst du, wie du eine einfache Zeitlinie mit den Veröffentlichungsdatum von Matplotlib erstellst. Eine Zeitlinie ist eine grafische Darstellung einer Reihe von Ereignissen in zeitlicher Reihenfolge. Zeitlinien können mit einer Sammlung von Daten und Text erstellt werden. In diesem Beispiel zeigen wir, wie du eine einfache Zeitlinie mit den Daten der neuesten Veröffentlichungen von Matplotlib erstellst.

Tipps für die VM

Nachdem der VM-Start abgeschlossen ist, klicke in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal musst du einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn du während des Lernens Probleme hast, kannst du Labby gerne fragen. Gib nach der Sitzung Feedback, und wir werden das Problem für dich prompt beheben.

Daten abrufen

Um eine Zeitlinie zu erstellen, müssen wir Daten wie Datum und Name abrufen. In diesem Beispiel verwenden wir die Veröffentlichungen von Matplotlib und deren Daten von GitHub. Wenn die Daten aus irgendeinem Grund nicht abgerufen werden können, verwenden wir als Backup die Fallback-Daten. Hier ist der Code zum Abrufen der Daten:

from datetime import datetime

import matplotlib.pyplot as plt
import numpy as np

import matplotlib.dates as mdates

try:
    ## Versuche, eine Liste der Matplotlib-Veröffentlichungen und deren Daten
    ## von https://api.github.com/repos/matplotlib/matplotlib/releases abzurufen
    import json
    import urllib.request

    url = 'https://api.github.com/repos/matplotlib/matplotlib/releases'
    url += '?per_page=100'
    data = json.loads(urllib.request.urlopen(url, timeout=1).read().decode())

    dates = []
    names = []
    for item in data:
        if 'rc' not in item['tag_name'] and 'b' not in item['tag_name']:
            dates.append(item['published_at'].split("T")[0])
            names.append(item['tag_name'])
    ## Konvertiere Datumsstrings (z.B. 2014-10-18) in datetime
    dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]

except Exception:
    ## Wenn das obige fehlschlägt, z.B. aufgrund eines fehlenden Internetverbindungs
    ## verwende die folgenden Listen als Fallback.
    names = ['v2.2.4', 'v3.0.3', 'v3.0.2', 'v3.0.1', 'v3.0.0', 'v2.2.3',
             'v2.2.2', 'v2.2.1', 'v2.2.0', 'v2.1.2', 'v2.1.1', 'v2.1.0',
             'v2.0.2', 'v2.0.1', 'v2.0.0', 'v1.5.3', 'v1.5.2', 'v1.5.1',
             'v1.5.0', 'v1.4.3', 'v1.4.2', 'v1.4.1', 'v1.4.0']

    dates = ['2019-02-26', '2019-02-26', '2018-11-10', '2018-11-10',
             '2018-09-18', '2018-08-10', '2018-03-17', '2018-03-16',
             '2018-03-06', '2018-01-18', '2017-12-10', '2017-10-07',
             '2017-05-10', '2017-05-02', '2017-01-17', '2016-09-09',
             '2016-07-03', '2016-01-10', '2015-10-29', '2015-02-16',
             '2014-10-26', '2014-10-18', '2014-08-26']

    ## Konvertiere Datumsstrings (z.B. 2014-10-18) in datetime
    dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]

Erstellen eines Stengelplots

Als nächstes erstellen wir einen Stengelplot mit einigen Unterschieden in den Höhen, um auch nahe beieinander liegende Ereignisse zu unterscheiden. Wir fügen Marker auf der Grundlinie hinzu, um die eindimensionale Natur der Zeitlinie visuell zu betonen. Für jedes Ereignis fügen wir eine Textbeschriftung über ~.Axes.annotate hinzu, die in Punkten von der Spitze der Ereignislinie versetzt ist. Hier ist der Code zum Erstellen eines Stengelplots:

## Wähle einige schöne Höhen
levels = np.tile([-5, 5, -3, 3, -1, 1],
                 int(np.ceil(len(dates)/6)))[:len(dates)]

## Erstelle Figur und zeichne einen Stengelplot mit dem Datum
fig, ax = plt.subplots(figsize=(8.8, 4), layout="constrained")
ax.set(title="Matplotlib release dates")

ax.vlines(dates, 0, levels, color="tab:red")  ## Die vertikalen Stengel.
ax.plot(dates, np.zeros_like(dates), "-o",
        color="k", markerfacecolor="w")  ## Grundlinie und Marker darauf.

## Beschrifte die Linien
for d, l, r in zip(dates, levels, names):
    ax.annotate(r, xy=(d, l),
                xytext=(-3, np.sign(l)*3), textcoords="offset points",
                horizontalalignment="right",
                verticalalignment="bottom" if l > 0 else "top")

Formatieren des Plots

Jetzt werden wir den Plot formatieren, indem wir x- und y-Achsenbeschriftungen hinzufügen, den x-Achsen-Major-Locator und -Formatter einstellen und die y-Achse und die Rahmungen entfernen. Hier ist der Code zum Formatieren des Plots:

## format x-axis with 4-month intervals
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=4))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
plt.setp(ax.get_xticklabels(), rotation=30, ha="right")

## remove y-axis and spines
ax.yaxis.set_visible(False)
ax.spines[["left", "top", "right"]].set_visible(False)

ax.margins(y=0.1)
plt.show()

Alles zusammenfügen

Hier ist der endgültige Code zum Erstellen einer einfachen Zeitlinie mit den Veröffentlichungsdatum von Matplotlib:

from datetime import datetime

import matplotlib.pyplot as plt
import numpy as np

import matplotlib.dates as mdates

try:
    ## Versuche, eine Liste der Matplotlib-Veröffentlichungen und deren Daten
    ## von https://api.github.com/repos/matplotlib/matplotlib/releases abzurufen
    import json
    import urllib.request

    url = 'https://api.github.com/repos/matplotlib/matplotlib/releases'
    url += '?per_page=100'
    data = json.loads(urllib.request.urlopen(url, timeout=1).read().decode())

    dates = []
    names = []
    for item in data:
        if 'rc' not in item['tag_name'] and 'b' not in item['tag_name']:
            dates.append(item['published_at'].split("T")[0])
            names.append(item['tag_name'])
    ## Konvertiere Datumsstrings (z.B. 2014-10-18) in datetime
    dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]

except Exception:
    ## Wenn das obige fehlschlägt, z.B. aufgrund eines fehlenden Internetverbindungs
    ## verwende die folgenden Listen als Fallback.
    names = ['v2.2.4', 'v3.0.3', 'v3.0.2', 'v3.0.1', 'v3.0.0', 'v2.2.3',
             'v2.2.2', 'v2.2.1', 'v2.2.0', 'v2.1.2', 'v2.1.1', 'v2.1.0',
             'v2.0.2', 'v2.0.1', 'v2.0.0', 'v1.5.3', 'v1.5.2', 'v1.5.1',
             'v1.5.0', 'v1.4.3', 'v1.4.2', 'v1.4.1', 'v1.4.0']

    dates = ['2019-02-26', '2019-02-26', '2018-11-10', '2018-11-10',
             '2018-09-18', '2018-08-10', '2018-03-17', '2018-03-16',
             '2018-03-06', '2018-01-18', '2017-12-10', '2017-10-07',
             '2017-05-10', '2017-05-02', '2017-01-17', '2016-09-09',
             '2016-07-03', '2016-01-10', '2015-10-29', '2015-02-16',
             '2014-10-26', '2014-10-18', '2014-08-26']

    ## Konvertiere Datumsstrings (z.B. 2014-10-18) in datetime
    dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]

## Wähle einige schöne Höhen
levels = np.tile([-5, 5, -3, 3, -1, 1],
                 int(np.ceil(len(dates)/6)))[:len(dates)]

## Erstelle Figur und zeichne einen Stengelplot mit dem Datum
fig, ax = plt.subplots(figsize=(8.8, 4), layout="constrained")
ax.set(title="Matplotlib release dates")

ax.vlines(dates, 0, levels, color="tab:red")  ## Die vertikalen Stengel.
ax.plot(dates, np.zeros_like(dates), "-o",
        color="k", markerfacecolor="w")  ## Grundlinie und Marker darauf.

## Beschrifte die Linien
for d, l, r in zip(dates, levels, names):
    ax.annotate(r, xy=(d, l),
                xytext=(-3, np.sign(l)*3), textcoords="offset points",
                horizontalalignment="right",
                verticalalignment="bottom" if l > 0 else "top")

## format x-axis with 4-month intervals
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=4))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
plt.setp(ax.get_xticklabels(), rotation=30, ha="right")

## remove y-axis and spines
ax.yaxis.set_visible(False)
ax.spines[["left", "top", "right"]].set_visible(False)

ax.margins(y=0.1)
plt.show()

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man eine einfache Zeitlinie mit den Veröffentlichungsdatum von Matplotlib erstellt. Sie haben gelernt, wie man Daten abruft, einen Stengelplot erstellt, den Plot formatiert und alles zusammenführt. Zeitlinien können verwendet werden, um jede Sequenz von Ereignissen in zeitlicher Reihenfolge zu visualisieren.