日付目盛りの位置付け関数とフォーマッタ

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、Matplotlib のさまざまな日付目盛りの位置付け関数とフォーマッタをどのように使用するかを理解することを目的としています。このチュートリアルでは、時系列データを持つプロットの X 軸をカスタマイズするためにこれらの関数をどのように使用するかを示します。

VM のヒント

VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み完了するまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

必要なライブラリのインポート

このチュートリアルで必要なライブラリをインポートして始めましょう。matplotlibnumpy を使用します。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.dates import (
    FR, MO, MONTHLY, SA, SU, TH, TU, WE, AutoDateFormatter, AutoDateLocator,
    ConciseDateFormatter, DateFormatter, DayLocator, HourLocator,
    MicrosecondLocator, MinuteLocator, MonthLocator, RRuleLocator, SecondLocator,
    WeekdayLocator, YearLocator, rrulewrapper)
import matplotlib.ticker as ticker

位置付け関数とフォーマッタの定義

使用するさまざまな位置付け関数とフォーマッタを定義します。この例では、次の位置付け関数を使用します。

  • AutoDateLocator(maxticks=8)
  • YearLocator(month=4)
  • MonthLocator(bymonth=[4, 8, 12])
  • DayLocator(interval=180)
  • WeekdayLocator(byweekday=SU, interval=4)
  • HourLocator(byhour=range(0, 24, 6))
  • MinuteLocator(interval=15)
  • SecondLocator(bysecond=(0, 30))
  • MicrosecondLocator(interval=1000)
  • RRuleLocator(rrulewrapper(freq=MONTHLY, byweekday=(MO, TU, WE, TH, FR), bysetpos=-1))

および次のフォーマッタ。

  • AutoDateFormatter(ax.xaxis.get_major_locator())
  • ConciseDateFormatter(ax.xaxis.get_major_locator())
  • DateFormatter("%b %Y")
locators = [
    ('AutoDateLocator(maxticks=8)', '2003-02-01', '%Y-%m'),
    ('YearLocator(month=4)', '2003-02-01', '%Y-%m'),
    ('MonthLocator(bymonth=[4, 8, 12])', '2003-02-01', '%Y-%m'),
    ('DayLocator(interval=180)', '2003-02-01', '%Y-%m-%d'),
    ('WeekdayLocator(byweekday=SU, interval=4)', '2000-07-01', '%a %Y-%m-%d'),
    ('HourLocator(byhour=range(0, 24, 6))', '2000-02-04', '%H h'),
    ('MinuteLocator(interval=15)', '2000-02-01 02:00', '%H:%M'),
    ('SecondLocator(bysecond=(0, 30))', '2000-02-01 00:02', '%H:%M:%S'),
    ('MicrosecondLocator(interval=1000)', '2000-02-01 00:00:00.005', '%S.%f'),
    ('RRuleLocator(rrulewrapper(freq=MONTHLY, byweekday=(MO, TU, WE, TH, FR), '
     'bysetpos=-1))', '2000-07-01', '%Y-%m-%d'),
]

formatters = [
    'AutoDateFormatter(ax.xaxis.get_major_locator())',
    'ConciseDateFormatter(ax.xaxis.get_major_locator())',
    'DateFormatter("%b %Y")',
]

グラフの描画

これで、グラフを作成することができます。位置付け関数とフォーマッタをそれぞれ別々に示すために、2 つのサブプロットを作成します。各位置付け関数とフォーマッタについて、それが X 軸にどのような影響を与えるかを示すグラフを描画します。これを行うために plot_axis 関数を使用します。この関数は、各軸の共通パラメータ、たとえばスパイン、目盛りパラメータ、および制限を設定します。また、X 軸の位置付け関数とフォーマッタも設定します。

def plot_axis(ax, locator=None, xmax='2002-02-01', fmt=None, formatter=None):
    ax.spines[['left', 'right', 'top']].set_visible(False)
    ax.yaxis.set_major_locator(ticker.NullLocator())
    ax.tick_params(which='major', width=1.00, length=5)
    ax.tick_params(which='minor', width=0.75, length=2.5)
    ax.set_xlim(np.datetime64('2000-02-01'), np.datetime64(xmax))
    if locator:
        ax.xaxis.set_major_locator(eval(locator))
        ax.xaxis.set_major_formatter(DateFormatter(fmt))
    else:
        ax.xaxis.set_major_formatter(eval(formatter))
    ax.text(0.0, 0.2, locator or formatter, transform=ax.transAxes,
            fontsize=14, fontname='Monospace', color='tab:blue')


fig, axs = plt.subplots(len(locators), 1, figsize=(8, len(locators) *.8),
                        layout='constrained')
fig.suptitle('Date Locators')
for ax, (locator, xmax, fmt) in zip(axs, locators):
    plot_axis(ax, locator, xmax, fmt)

fig, axs = plt.subplots(len(formatters), 1, figsize=(8, len(formatters) *.8),
                        layout='constrained')
fig.suptitle('Date Formatters')
for ax, fmt in zip(axs, formatters):
    plot_axis(ax, formatter=fmt)

グラフの表示

最後に、plt.show() 関数を使用してグラフを表示することができます。

plt.show()

まとめ

このチュートリアルでは、Matplotlib におけるさまざまな日付目盛りの位置付け関数とフォーマッタの使い方を学びました。時系列データを持つプロットの X 軸に各位置付け関数とフォーマッタがどのような影響を与えるかを示すいくつかのグラフを描画しました。この知識は、時系列データの可視化を作成する際に役立つことがあります。