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.