Datumsmarkierungen mit ConciseDateFormatter formatieren #

Gute Tick-Werte zu finden und die Ticks für eine Achse mit Datumsdaten zu formatieren, ist oft eine Herausforderung. ConciseDateFormattersoll die für die Ticklabels gewählten Strings verbessern und die in diesen Ticklabels verwendeten Strings so weit wie möglich minimieren.

Notiz

Dieser Formatierer ist ein Kandidat dafür, in zukünftigen Versionen von Matplotlib der Standardformatierer für Datumsmarkierungen zu werden. Bitte melden Sie Probleme oder Verbesserungsvorschläge an das Github-Repository oder die Mailingliste.

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

Zuerst der Standardformatierer.

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))

fig, axs = plt.subplots(3, 1, constrained_layout=True, 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()
Standard-Datumsformatierer

Der standardmäßige Datumsformatierer ist ziemlich ausführlich, daher haben wir die Möglichkeit, ConciseDateFormatter, wie unten gezeigt, zu verwenden. Beachten Sie, dass die Beschriftungen für dieses Beispiel nicht wie beim Standardformatierer gedreht werden müssen, da die Beschriftungen so klein wie möglich sind.

fig, axs = plt.subplots(3, 1, constrained_layout=True, 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()
Prägnanter Datumsformatierer

Wenn alle Aufrufe von Achsen mit Datumsangaben mit diesem Konverter erfolgen sollen, ist es wahrscheinlich am bequemsten, die Einheitenregistrierung zu verwenden, in der Sie Importe durchführen:

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), constrained_layout=True)
for nn, ax in enumerate(axs):
    ax.plot(dates, y)
    ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter')

plt.show()
Prägnanter Datumsformatierer

Lokalisierung von Datumsformaten #

Datumsformate können lokalisiert werden, wenn die Standardformate nicht erwünscht sind, indem eine von drei Listen von Zeichenfolgen bearbeitet wird.

The formatter.formats list of formats is for the normal tick labels, There are six levels: years, months, days, hours, minutes, seconds. The formatter.offset_formats is how the "offset" string on the right of the axis is formatted. This is usually much more verbose than the tick labels. Finally, the formatter.zero_formats are the formats of the ticks that are "zeros". These are tick values that are either the first of the year, month, or day of month, or the zeroth hour, minute, or second. These are usually the same as the format of the ticks a level above. For example if the axis limits mean the ticks are mostly days, then we label 1 Mar 2005 simply with a "Mar". If the axis limits are mostly hours, we label Feb 4 00:00 as simply "Feb-4".

Beachten Sie, dass diese Formatlisten auch ConciseDateFormatter als optionale Schlüsselwortargumente übergeben werden können.

Hier ändern wir die Beschriftungen in "Tag Monat Jahr" anstelle von ISO "Jahr Monat Tag":

fig, axs = plt.subplots(3, 1, constrained_layout=True, figsize=(6, 6))

for nn, ax in enumerate(axs):
    locator = mdates.AutoDateLocator()
    formatter = mdates.ConciseDateFormatter(locator)
    formatter.formats = ['%y',  # ticks are mostly years
                         '%b',       # ticks are mostly months
                         '%d',       # ticks are mostly days
                         '%H:%M',    # hrs
                         '%H:%M',    # min
                         '%S.%f', ]  # secs
    # these are mostly just the level above...
    formatter.zero_formats = [''] + formatter.formats[:-1]
    # ...except for ticks that are mostly hours, then it is nice to have
    # month-day:
    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()
Prägnanter Datumsformatierer

Registrieren eines Konverters mit Lokalisierung #

ConciseDateFormatterhat keine rcParams-Einträge, aber die Lokalisierung kann erreicht werden, indem Schlüsselwortargumente an ConciseDateConverterdie Einheitenregistrierung übergeben und die Datentypen registriert werden, die Sie verwenden werden:

import datetime

formats = ['%y',          # ticks are mostly years
           '%b',     # ticks are mostly months
           '%d',     # ticks are mostly days
           '%H:%M',  # hrs
           '%H:%M',  # min
           '%S.%f', ]  # secs
# these can be the same, except offset by one level....
zero_formats = [''] + formats[:-1]
# ...except for ticks that are mostly hours, then its nice to have month-day
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, constrained_layout=True, 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()
Concise Date Formatter registered non-default

Gesamtlaufzeit des Skripts: ( 0 Minuten 3.859 Sekunden)

Galerie generiert von Sphinx-Gallery