ConciseDateFormatter を使用して日付ティックをフォーマットする#

適切な目盛り値を見つけて、日付データを含む軸の目盛りを書式設定することは、多くの場合困難です。ConciseDateFormatter目盛りラベルに選択された文字列を改善し、それらの目盛りラベルで使用される文字列を可能な限り最小限に抑えることを目的としています。

ノート

このフォーマッタは、Matplotlib の将来のバージョンでデフォルトの日付ティック フォーマッタになる候補です。問題や改善のための提案があれば、github リポジトリまたはメーリング リストに報告してください。

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

まず、デフォルトのフォーマッタ。

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()
デフォルトの日付フォーマッタ

デフォルトの日付フォーマッタは非常に冗長であるため、ConciseDateFormatter以下に示すように を使用するオプションがあります。この例では、ラベルが可能な限り小さいため、既定のフォーマッタのようにラベルを回転する必要がないことに注意してください。

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()
簡潔な日付フォーマッター

日付を持つ軸へのすべての呼び出しがこのコンバーターを使用して行われる場合は、インポートを行う単位レジストリを使用するのがおそらく最も便利です。

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()
簡潔な日付フォーマッター

日付形式のローカライズ#

デフォルトのフォーマットが望ましくない場合は、3 つの文字列リストのいずれかを操作して、日付フォーマットをローカライズできます。

フォーマットのformatter.formatsリストは、通常の目盛りラベル用です。年、月、日、時、分、秒の 6 つのレベルがあります。これformatter.offset_formatsは、軸の右側にある「オフセット」文字列がどのようにフォーマットされるかです。これは通常、目盛りラベルよりもはるかに詳細です。最後に、formatter.zero_formats「ゼロ」であるティックのフォーマットです。これらは、年、月、または月の日のいずれか、または 0 番目の時間、分、または秒のティック値です。これらは通常、1 レベル上のティックの形式と同じです。たとえば、軸の範囲がティックがほぼ日であることを意味する場合、2005 年 3 月 1 日に単純に「3 月」というラベルを付けます。軸の制限のほとんどが時間である場合、2 月 4 日 00:00 を単純に「Feb-4」とラベル付けします。

これらのフォーマット リストはConciseDateFormatter 、オプションのキーワード引数として に渡すこともできることに注意してください。

ここでは、ラベルを ISO の「年月日」ではなく「日月年」に変更します。

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()
簡潔な日付フォーマッター

ローカリゼーションでコンバーターを登録する#

ConciseDateFormatterには rcParams エントリがありませんが、キーワード引数を渡しConciseDateConverter、ユニット レジストリで使用するデータ型を登録することで、ローカライズを行うことができます。

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 がデフォルト以外に登録されました

スクリプトの合計実行時間: ( 0 分 3.859 秒)

Sphinx-Gallery によって生成されたギャラリー