Notiz
Klicken Sie hier , um den vollständigen Beispielcode herunterzuladen
Datumsmarkierungen mit ConciseDateFormatter formatieren #
Gute Tick-Werte zu finden und die Ticks für eine Achse mit Datumsdaten zu formatieren, ist oft eine Herausforderung. ConciseDateFormatter
soll 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()
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()
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()
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()
Registrieren eines Konverters mit Lokalisierung #
ConciseDateFormatter
hat keine rcParams-Einträge, aber die Lokalisierung kann erreicht werden, indem Schlüsselwortargumente an ConciseDateConverter
die 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()
Gesamtlaufzeit des Skripts: ( 0 Minuten 3.859 Sekunden)