Matplotlib Datumsmarkierungsformatter

MatplotlibMatplotlibBeginner
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

Der ~.dates.ConciseDateFormatter ist ein nützliches Tool zur Formatierung von Datumsmarkierungen, wenn Sie mit Matplotlib arbeiten. In diesem Lab werden Sie lernen, wie Sie diesen Formatter verwenden, um die für die Markierungsbeschriftungen ausgewählten Zeichenketten zu verbessern und die in diesen Markierungsbeschriftungen verwendeten Zeichenketten möglichst zu minimieren.

Tipps für die VM

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

Manchmal müssen Sie 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 Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Standardformatter

Wir beginnen mit der Betrachtung des Standardformatters und seiner ausführlichen Ausgabe. Wir plotten Daten über die Zeit und sehen, wie der Standardformatter das Datum und die Uhrzeit anzeigt.

import datetime
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates

## create time data
base = datetime.datetime(2005, 2, 1)
dates = [base + datetime.timedelta(hours=(2 * i)) for i in range(732)]
N = len(dates)
np.random.seed(19680801)
y = np.cumsum(np.random.randn(N))

## plot data
fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(6, 6))
lims = [(np.datetime64('2005-02'), np.datetime64('2005-04')),
        (np.datetime64('2005-02-03'), np.datetime64('2005-02-15')),
        (np.datetime64('2005-02-03 11:00'), np.datetime64('2005-02-04 13:20'))]
for nn, ax in enumerate(axs):
    ax.plot(dates, y)
    ax.set_xlim(lims[nn])
    ## rotate labels...
    for label in ax.get_xticklabels():
        label.set_rotation(40)
        label.set_horizontalalignment('right')
axs[0].set_title('Default Date Formatter')
plt.show()

Kürzerer Datumsformatter

Als nächstes untersuchen wir den ~.dates.ConciseDateFormatter und seine Ausgabe. Wir erstellen ein neues Diagramm mit dem kürzeren Datumsformatter und sehen, wie es sich von dem Standardformatter unterscheidet.

fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(6, 6))
for nn, ax in enumerate(axs):
    locator = mdates.AutoDateLocator(minticks=3, maxticks=7)
    formatter = mdates.ConciseDateFormatter(locator)
    ax.xaxis.set_major_locator(locator)
    ax.xaxis.set_major_formatter(formatter)

    ax.plot(dates, y)
    ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter')
plt.show()

Registrieren eines Konverters

Wenn alle Aufrufe von Achsen, die Daten enthalten, mit diesem Konverter durchgeführt werden sollen, ist es wahrscheinlich am bequemsten, die Einheitenregistrierung zu verwenden. Wir registrieren einen Konverter mit der Einheitenregistrierung und plotten Daten mit dem kürzeren Datumsformatter.

import datetime
import matplotlib.units as munits

converter = mdates.ConciseDateConverter()
munits.registry[np.datetime64] = converter
munits.registry[datetime.date] = converter
munits.registry[datetime.datetime] = converter

fig, axs = plt.subplots(3, 1, figsize=(6, 6), layout='constrained')
for nn, ax in enumerate(axs):
    ax.plot(dates, y)
    ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter')
plt.show()

Lokalisierung von Datumsformaten

Datumsformate können lokalisiert werden, wenn die Standardformate nicht erwünscht sind, indem man eine von drei Zeichenkettenlisten manipuliert. Wir ändern die Beschriftungen zu "Tag Monat Jahr" anstelle des ISO-Standards "Jahr Monat Tag".

fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(6, 6))

for nn, ax in enumerate(axs):
    locator = mdates.AutoDateLocator()
    formatter = mdates.ConciseDateFormatter(locator)
    formatter.formats = ['%y',  ## Die Markierungen sind meistens Jahre
                         '%b',       ## Die Markierungen sind meistens Monate
                         '%d',       ## Die Markierungen sind meistens Tage
                         '%H:%M',    ## Stunden
                         '%H:%M',    ## Minuten
                         '%S.%f', ]  ## Sekunden
    ## Dies sind hauptsächlich die Ebene darüber...
    formatter.zero_formats = [''] + formatter.formats[:-1]
    #...außer für Markierungen, die meistens Stunden sind, dann ist es schön,
    ## Monat-Tag zu haben:
    formatter.zero_formats[3] = '%d-%b'

    formatter.offset_formats = ['',
                                '%Y',
                                '%b %Y',
                                '%d %b %Y',
                                '%d %b %Y',
                                '%d %b %Y %H:%M', ]
    ax.xaxis.set_major_locator(locator)
    ax.xaxis.set_major_formatter(formatter)

    ax.plot(dates, y)
    ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter')
plt.show()

Registrieren eines Konverters mit Lokalisierung

Wir können auch einen Konverter mit Lokalisierung registrieren, indem wir Schlüsselwortargumente an ~.dates.ConciseDateConverter übergeben und die Datentypen, die wir verwenden werden, mit der Einheitenregistrierung registrieren.

import datetime

formats = ['%y',          ## Die Markierungen sind meistens Jahre
           '%b',     ## Die Markierungen sind meistens Monate
           '%d',     ## Die Markierungen sind meistens Tage
           '%H:%M',  ## Stunden
           '%H:%M',  ## Minuten
           '%S.%f', ]  ## Sekunden
## Dies können die gleichen sein, nur um eine Ebene verschoben...
zero_formats = [''] + formats[:-1]
#...außer für Markierungen, die meistens Stunden sind, dann ist es schön, Monat-Tag zu haben
zero_formats[3] = '%d-%b'
offset_formats = ['',
                  '%Y',
                  '%b %Y',
                  '%d %b %Y',
                  '%d %b %Y',
                  '%d %b %Y %H:%M', ]

converter = mdates.ConciseDateConverter(
    formats=formats, zero_formats=zero_formats, offset_formats=offset_formats)

munits.registry[np.datetime64] = converter
munits.registry[datetime.date] = converter
munits.registry[datetime.datetime] = converter

fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(6, 6))
for nn, ax in enumerate(axs):
    ax.plot(dates, y)
    ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter registered non-default')
plt.show()

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie den ~.dates.ConciseDateFormatter verwenden, um Datumsmarkierungen zu formatieren, wenn Sie mit Matplotlib arbeiten. Sie haben auch gelernt, wie Sie Datumsformate lokalisieren und Converter registrieren, um den Prozess komfortabler zu gestalten.