【Matplotlib】datetime型の時間軸をコンパクトにする (plot_date)

時系列データの可視化に悩んでいませんか?時系列グラフを正確に表示する方法がわからない場合,データのパターンや傾向を見逃してしまうかもしれません

この記事では,Matplotlibのplot_date関数を活用することで,datetime型の時系列データを簡単にグラフ化する方法をお教えします

自身のプロジェクトや分析において,正確で美しい時系列グラフを作成することが可能になります。さらに,グラフのカスタマイズやスタイリングの方法も学ぶことができます

この記事では,具体的なコードとグラフで,Matplotlibのplot_date関数の使い方を詳しく解説します

目次

日付のリストと株価データの作成

時系列グラフはdatetime型の日付リストと数値のリストが用いられます

この記事では,2021年1月から2021年6月までの1週間ごとの日付データを作成しました

また,数値のリストは3社の株価リストを模擬しています

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

# step1 データ作成
# 2021年1月から2021年6月までの1週間ごとの日付データを作成
start_date = datetime.datetime(2021, 1, 1)
end_date = datetime.datetime(2021, 3, 30)
# 日付の空リストを作成
date_list = []
current_date = start_date
while current_date <= end_date:
    # 日付の空リストに日付を追加
    date_list.append(current_date)
    # 1週間後の日付に更新
    current_date += datetime.timedelta(weeks=1)

# 3社の株価リストを作成(date_listと同じ要素数)
company1_stock_prices = [100, 105, 102, 110, 108, 115, 120, 118, 122, 125, 130, 128, 135]
company2_stock_prices = [80, 85, 88, 90, 92, 95, 100, 98, 102, 105, 110, 108, 105]
company3_stock_prices = [120, 125, 130, 135, 138, 140, 142, 145, 148, 150, 152, 155, 158]

最終的には時間軸がスッキリまとまったグラフにすることができます

一般的な時系列グラフ (plot_date)

前章で作成した日付リストと株価リストで時系列グラフを描画します

時系列グラフはplot_date関数で描画することができます

Axes.plot_date
引数
  • x (配列) : 1次元の配列データ
  • y (配列) : 1次元の配列データ
  • fmt (文字列) : フォーマット文字列.線種,線色,マーカーを一度に指定可能
  • tz (タイムゾーン文字列) : タイムゾーン
  • xdate (True or False) : x軸の時間軸の設定
  • ydate (True or False) : y軸の時間軸の設定
返値
公式ドキュメント
# step2 グラフフレームの作成
fig, ax = plt.subplots()
# step3 時系列グラフの描画
ax.plot_date(date_list, company1_stock_prices, label='Company 1')
ax.plot_date(date_list, company2_stock_prices, label='Company 2')
ax.plot_date(date_list, company3_stock_prices, label='Company 3')

#step4 軸のカスタム
ax.set_xlabel('Time label')
ax.set_ylabel('Y label')  
ax.legend()
ax.set_title('Chart with time axis')

plt.show()

フォーマットの設定 (fmt)

fmt(フォーマット文字列)は,下記のようにマーカー,線種,色を一度に指定できます

fmt = '[marker][line][color]'

fmtを使って3種類の時系列グラフを作成してみました

# step3 時系列グラフの描画
ax.plot_date(date_list, company1_stock_prices, 'og--', label='Company 1')
ax.plot_date(date_list, company2_stock_prices, 'sr-.', label='Company 2')
ax.plot_date(date_list, company3_stock_prices, '*c:', label='Company 3')

plt.show()

y軸を時間軸に変更 (xdate, ydate)

plot_date関数はデフォルトでx軸が時間軸ですが,y軸を時間軸とすることも可能です

xdate=False, ydate=Trueでy軸のみ時間軸となります

# step3 時系列グラフの描画
ax.plot_date(company1_stock_prices, date_list, 'o-', xdate=False, ydate=True, label='Company 1')
ax.plot_date(company2_stock_prices, date_list, 'o-', xdate=False, ydate=True, label='Company 2')
ax.plot_date(company3_stock_prices, date_list, 'o-', xdate=False, ydate=True, label='Company 3')

plt.show()

目盛りの刻みを設定する (AutoDateLocator)

時間軸の目盛りの位置や数,刻みを設定するには,AutoDateLocatorというクラスを使います

matplotlib.dates.AutoDateLocator
属性
  • intervald (辞書) : 刻みの頻度と,その刻みで許容される倍数
self.intervald = {
    YEARLY  : [1, 2, 4, 5, 10, 20, 40, 50, 100, 200, 400, 500,
               1000, 2000, 4000, 5000, 10000],
    MONTHLY : [1, 2, 3, 4, 6],
    DAILY   : [1, 2, 3, 7, 14, 21],
    HOURLY  : [1, 2, 3, 4, 6, 12],
    MINUTELY: [1, 5, 10, 15, 30],
    SECONDLY: [1, 5, 10, 15, 30],
    MICROSECONDLY: [1, 2, 5, 10, 20, 50, 100, 200, 500,
                    1000, 2000, 5000, 10000, 20000, 50000,
                    100000, 200000, 500000, 1000000],
}
引数
  • tz (タイムゾーン文字列) : タイムゾーン
  • minticks (int) : 最小目盛り数.毎年,毎月などで設定可能
  • maxticks (int) : 最大目盛り数.毎年,毎月などで設定可能
  • interval_multiples (True or False) : 目盛り間隔を倍数にするかどうか.ex) 6時間間隔の場合,0,6,12,18時間に強制的に設定
公式ドキュメント

目盛りの刻み頻度を少なくする (minticks)

AutoDateLocatorクラスのminticksを指定すると,最小の目盛り数を指定できます

この記事では最小目盛り数を3に指定しました

ただし,目盛りの刻み方はintervaldで決まっています (今回はMONTHLY=1)

import matplotlib.dates as mdates

# step3 時系列グラフの描画
ax.plot_date(date_list, company1_stock_prices, 'o-', label='Company 1')
ax.plot_date(date_list, company2_stock_prices, 'o-', label='Company 2')
ax.plot_date(date_list, company3_stock_prices, 'o-', label='Company 3')

#step4 軸のカスタム
locator = mdates.AutoDateLocator(minticks=3)
ax.xaxis.set_major_locator(locator)

plt.show()

目盛りの刻み頻度を多くする (maxticks)

AutoDateLocatorクラスのmaxticksを指定すると,最大の目盛り数を指定できます

この記事では最大目盛り数を15に指定しました

ただし,目盛りの刻み方はintervaldで決まっています (今回はDAILY=7)

import matplotlib.dates as mdates

# step3 時系列グラフの描画
ax.plot_date(date_list, company1_stock_prices, 'o-', label='Company 1')
ax.plot_date(date_list, company2_stock_prices, 'o-', label='Company 2')
ax.plot_date(date_list, company3_stock_prices, 'o-', label='Company 3')

#step4 軸のカスタム
locator = mdates.AutoDateLocator(maxticks=15)
ax.xaxis.set_major_locator(locator)

plt.show()

日付をコンパクトに表示する (ConciseDateFormatter)

日付は長くなりやすく,x軸を時間軸と設定する場合,目盛りの数を増やすことが難しいです

そこでConciseDateFormatterクラスを使用すると,最適な書式で可能な限りコンパクトに表示してくれます

matplotlib.dates.ConciseDateFormatter
引数
  • locater (ticker.Locator) : AutoDateLocatorで作成したLocater
  • tz (タイムゾーン文字列) : タイムゾーン
  • formats (リスト) : 主に年,月,日,時,分,秒.strftimeと同じフォーマット.['%Y', '%b', '%d', '%H:%M', '%H:%M', '%S.%f']
  • zero_formats (リスト) : ['', '%Y', '%b', '%b-%d', '%H:%M', '%H:%M']
  • offset_formats (リスト) : x軸の右側,またはy軸の上側のオフセット文字列のフォーマット.['', '%Y', '%Y-%b', '%Y-%b-%d', '%Y-%b-%d', '%Y-%b-%d %H:%M']
  • show_offset (True or False) : オフセットの表示
  • usetex (True or False) : TeXの数式
公式ドキュメント

自動で日付の書式を整える (locater)

前章の目盛りの刻み頻度を多くするで作成したlocaterConciseDateFormatterクラスに指定してグラフを描画します

右下に年-月のオフセットが表示され,時間軸はコンパクトにまとまっています

#step4 軸のカスタム
locator = mdates.AutoDateLocator(maxticks=15)
ax.xaxis.set_major_locator(locator)
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_formatter(formatter)

plt.show()

日付の書式をカスタムする (formats, show_offset)

formatsをリストで指定すると,年,月,日,時,分,秒の表示形式をカスタムできます

デフォルトは,['%Y', '%b', '%d', '%H:%M', '%H:%M', '%S.%f']で,'%b'→'%Y-%b'年+月に変更しました

また,show_offsetをFalseで右下のオフセットを非表示にできます

#step4 軸のカスタム
locator = mdates.AutoDateLocator(maxticks=15)
ax.xaxis.set_major_locator(locator)
# 変更 '%b'→'%Y-%b'
formats=['%Y', '%Y-%b', '%d', '%H:%M', '%H:%M', '%S.%f']
formatter = mdates.ConciseDateFormatter(locator, formats=formats, show_offset=False)
ax.xaxis.set_major_formatter(formatter)

plt.show()

一部の日付のみ別で表示する (offset_format, usetex)

offset_formatsをリストで指定すると,グラフ右下のオフセットの表示形式をカスタムできます

デフォルトは,['', '%Y', '%Y-%b', '%Y-%b-%d', '%Y-%b-%d', '%Y-%b-%d %H:%M']で,3要素目を'%Y-%b'→'%Y'年だけに変更しました

また,use_texをTrueでTeXの数式にできます(私には違いがわかりませんでした)

#step4 軸のカスタム
locator = mdates.AutoDateLocator(maxticks=15)
ax.xaxis.set_major_locator(locator)
# 変更 '%Y-%b'→'%Y'
offset_formats=['', '%Y', '%Y', '%Y-%b-%d', '%Y-%b-%d', '%Y-%b-%d %H:%M']
formatter = mdates.ConciseDateFormatter(locator, offset_formats=offset_formats, usetex=True)
ax.xaxis.set_major_formatter(formatter)

plt.show()

参考文献

Axes.plot_date関数の公式ドキュメント

matplotlib.datesクラスの公式ドキュメント

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次