時系列データのプロット

[3-7]の乱数値、[4-9]の乱数値を生成して、30分刻みの時系列データとしてプロット

#!/usr/bin/env python

import random
import dateutil.parser as parser
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

def plot():
    x = ["00:00", "00:30", "01:00", "01:30", "02:00", "02:30",
         "03:00", "03:30", "04:00", "04:30", "05:00", "05:30",
         "06:00", "06:30", "07:00", "07:30", "08:00", "08:30",
         "09:00", "09:30", "10:00", "10:30", "11:00", "11:30",
         "12:00", "12:30", "13:00", "13:30", "14:00", "14:30",
         "15:00", "15:30", "16:00", "16:30", "17:00", "17:30",
         "18:00", "18:30", "19:00", "19:30", "20:00", "20:30",
         "21:00", "21:30", "22:00", "22:30", "23:00", "23:30"]

    xval = [parser.parse(xv) for xv in x]
    yval1 = [random.randint(3,7) for i in range(48)]
    yval2 = [random.randint(4,9) for i in range(48)]
    
    fig = plt.figure()

    ax = fig.add_subplot(1,1,1)
    ax.plot(xval,yval1,marker='o',linestyle="-",label="y1")
    ax.plot(xval,yval2,marker='x',linestyle="--",label="y2")
    ax.set_ylim(0,10)
    ax.set_xlabel("Time")
    ax.set_ylabel("Y Value")
    ax.legend(loc="upper right")
    ax.grid()

    days = mdates.AutoDateLocator()
    daysFmt = mdates.DateFormatter("%H:%M")
    ax.xaxis.set_major_locator(days)
    ax.xaxis.set_major_formatter(daysFmt)

    plt.savefig("test.png")

    plt.close()


if __name__=="__main__":
    plot()

plot()の仕様(一部):
plot(x, y, marker='o', linestyle="-", label="xxx")

  • x: x要素のデータ(datetime型)
  • y: y要素のデータ
  • linestyle: 点同士をどのような線で結ぶか
  • legend: 凡例名


※より詳しくは、http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.plot を参照



Locator について: 時系列データの目盛の間隔を設定する

  • set_major_locator() の引数として、以下のいずれかのインスタンスを代入する
    • matplotlib.mdates.AutoDateLocator(): 自動的に間隔を決定
    • matplotlib.mdates.MonthLocator(): 月間隔
    • matplotlib.mdates.DayLocator(): 日間隔
    • matplotlib.mdates.HourLocator(): 時間隔
    • matplotlib.mdates.MinuteLocator(): 分間隔
    • etc.

※上記のサンプルコードで、AutoDateLocator() でなく、 HourLocator() を設定すると、目盛間隔が1時間ごとになる。

※より詳しくは、http://matplotlib.org/api/dates_api.html#date-tickers を参照



Formatter について: 日付のラベルの表示形式を設定する

  • set_major_formatter() の引数に、以下のいずれかのインスタンスを代入する
    • matplotlib.mdates.AutoDateFormatter(): 自動的に表示形式を設定
    • matplotlib.mdates.DateFormatter(): 引数にstrを代入して、表示形式を指定
      • matplotlib.mdates.DateFormatter("%H:%M"): 表示形式は "時:分" となる
      • matplotlib.mdates.DateFormatter("%m/%d %H:%M"): 表示形式は "月/日 時:分" となる
    • etc.

 ※より詳しくは、 http://matplotlib.org/api/dates_api.html#date-formatters を参照