Help us understand the problem. What is going on with this article?

時系列プロットはじめました〜python編〜

はじめに

この記事はMicroAd Advent Calendar 2019の22日目の記事です。

やりたいこと

ログデータを可視化するときに、時系列プロットは非常に有用な手段です。
今までは横軸の日付を適当に数字で置き換えてプロットして逃げてきた、そんな人生を送ってきました。
しかし今は違います。横軸を時系列にして、上手にプロットできるようになったのです!
ということで、その話を備忘録としてまとめたいと思います。
なおここで作成したグラフは最低限のオプションしか使用しておりません。

方法

matplotlib.dates を使うといい感じでプロットできます。
コード例を以下に挙げます。

日毎

import io
import pandas as pd
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()


def main():
    data = """date,value
    2018-12-01,15
    2018-12-02,30
    2018-12-03,25
    2018-12-04,18
    2018-12-05,9
    2018-12-06,22
    2018-12-07,34
    2018-12-08,33
    2018-12-09,28
    2018-12-10,22
    2018-12-11,26
    2018-12-12,31"""
    df = pd.read_csv(io.StringIO(data), parse_dates=[0])

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(df['date'], df['value'])

    ##以下をカスタマイズする
    daysFmt = mdates.DateFormatter('%Y-%m-%d')
    ax.xaxis.set_major_formatter(daysFmt)
    fig.autofmt_xdate()

    plt.show()


if __name__ == '__main__':
    main()

このコードで出来上がった図は以下の通りです。
qiita.png

ちょっと表示方法を変えてみるときは、

    daysFmt = mdates.DateFormatter('%Y-%m-%d')

ここをいじれば大丈夫です。

    daysFmt = mdates.DateFormatter('%m/%d')

上記のように変えると、x軸のラベルは以下のように表示されます。
qiita2.png

日時毎

データをちょっと変えて日時毎にやってみます。

import io
import pandas as pd
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()


def main():
    data = """date,value
        2018-12-01 00,15
        2018-12-01 01,30
        2018-12-01 02,25
        2018-12-01 03,18
        2018-12-01 04,9
        2018-12-01 05,22
        2018-12-01 06,34
        2018-12-01 07,33
        2018-12-01 08,28
        2018-12-01 09,22
        2018-12-01 10,26
        2018-12-01 11,31"""
    df = pd.read_csv(io.StringIO(data), parse_dates=[0])

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(df['date'], df['value'])

    ##以下をカスタマイズする
    daysFmt = mdates.DateFormatter('%m/%d %H:%M')
    ax.xaxis.set_major_formatter(daysFmt)
    fig.autofmt_xdate()

    plt.show()


if __name__ == '__main__':
    main()

得られた図は以下の通り。
qiita3.png

目盛りの頻度変更

目盛りの頻度を変えたい場合には、以下の二行を付け加えます。

    daysLoc = mdates.HourLocator(byhour=None, interval=3, tz=None)
    ax.xaxis.set_major_locator(daysLoc)

これで目盛りの頻度が変わります。
qiita4.png
随分寂しい図になってしまいました。
今回はintervalで設定しましたが、intervalオプションを削除してbyhour=range(2, 12, 3)で設定しても全く同じ結果を得ることができます。
ここで使用したHourLocater以外にもMonthLocator, WeekdayLocator, DayLocator, MonthLocator, MinuteLocator, SecondLocatorなどたくさんあるそうです。

軸ラベルの回転

軸ラベルが長すぎてはみ出してしまう!という場合には回転させることができます。
以下の二行を付け加えることでそれが可能です。

    labels = ax.get_xticklabels()
    plt.setp(labels, rotation=45)

得られた図はこの通り。
qiita5.png
確かにラベルの角度が代わっていることが確認できます。

最後に

自分が時系列プロットする際に必要だった最低限のオプションをまとめました。
状況に応じてもっと分かりやすいグラフを作成してください!
可視化ができたので、次は時系列解析ですね...

参考資料

matplotlib.dates(公式ドキュメント)
matplotlibで時系列データをプロットする際の軸の設定+おまけ
Python matplotlib 時系列グラフ(時間軸の設定)
matplotlib.datesで時系列データのグラフの軸目盛の設定をする

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした