時系列データの可視化に悩んでいませんか?時系列グラフを正確に表示する方法がわからない場合,データのパターンや傾向を見逃してしまうかもしれません
この記事では,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関数で描画することができます
- 引数
- 返値
-
- Line2Dのリスト
- 公式ドキュメント
# 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というクラスを使います
- 属性
-
- 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], }
- 引数
- 公式ドキュメント
目盛りの刻み頻度を少なくする (minticks)
AutoDateLocatorクラスのminticksを指定すると,最小の目盛り数を指定できます
この記事では最小目盛り数を3に指定しました
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に指定しました
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クラスを使用すると,最適な書式で可能な限りコンパクトに表示してくれます
- 引数
-
- 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)
前章の目盛りの刻み頻度を多くするで作成したlocaterをConciseDateFormatterクラスに指定してグラフを描画します
右下に年-月のオフセットが表示され,時間軸はコンパクトにまとまっています
#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クラスの公式ドキュメント
コメント