Matplotlibで間隔が疎らな時系列データを可視化する

クリスマス前後でしばらく寝込んでいたのですが、今週は体調が戻りました。 折角なので寝込んでいた時期の体温の変化を可視化してみます。

f:id:matsu7874:20181228230533p:plain

等間隔になっていないデータをどうプロットするか

体温はずっと測っていたわけではないので、時間軸の感覚が不揃いです。最大値と最小値のどこにいるかを計算して散布図を描くという手もありえますが、Matplotlibは最強でした。

横軸データを文字列ではなく、datetime型で渡してやるとMatplotlibがよしなにしてくれる。 この記事の学びはこれだけ!

実装

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

# 体温データを定義
temperature = [(datetime.datetime.strptime(t, '%Y-%m-%d %H:%M:%S'), v) for t,v in [
    ('2018-12-18 23:13:00', 37.5),
    ('2018-12-19 01:12:00', 39.0),
    ('2018-12-19 02:38:00', 38.1),
    ('2018-12-19 10:14:00', 37.0),
    ('2018-12-19 18:44:00', 36.7),
    ('2018-12-19 21:41:00', 37.5),
    ('2018-12-20 03:17:00', 37.5),
    ('2018-12-20 11:47:00', 37.0),
    ('2018-12-20 16:58:00', 36.6),
    ('2018-12-20 19:14:00', 37.2),
    ('2018-12-21 19:34:00', 36.8),
    ('2018-12-22 00:42:00', 36.7),
    ('2018-12-22 14:59:00', 36.8),
]]

df = pd.DataFrame(temperature, columns=['time', 'temperature'])

ax = plt.subplot()

ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d\n%H:%M'))
ax.set_xlim(datetime.datetime(2018, 12, 18, 18), datetime.datetime(2018, 12, 22, 18))
ax.set_ylim(36.3, 39.2)
ax.plot(df['time'], df['temperature'])
plt.show()

感想

時系列が等間隔でないデータを可視化するのも簡単ですね!