Matplotlib時系列プロット

## 時系列データのプロット

実世界のデータの多くは時系列で整理されています。可視化は時系列データのパターンを見出すための優れた方法です。 Matplotlibを使用した時系列データのプロットを試みます。

サンプルデータとして以下を使用します。date列は時系列、value01とvalue02は時系列で変化する計測値列です。

```csv
date,value01,value02
2021-01-01,1,100
2021-01-02,3,500
2021-01-03,2,200
2021-01-04,4,600
2021-01-05,3,300
2021-01-06,5,700
2021-01-07,4,400
2021-01-08,6,800
2021-01-09,5,500
2021-01-10,7,900
2021-01-11,6,600
2021-01-12,8,1000
2021-01-13,7,700
2021-01-14,9,1100
2021-01-15,8,800
2021-01-16,10,1200
```

まずはサンプルデータをインポートします。（日付をインデックスとして）[pandas.read_csv](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)

```python
import pandas as pd

df = pd.read_csv('df.csv', parse_dates=['date'], index_col='date')
```

時系列データの全体をプロットします。

```python
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
plt.xticks(rotation=90)
ax.plot(df.index, df['value01'])
ax.set_xlabel('Date')
ax.set_ylabel('Value01')
plt.show()
```

![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/e6d4c9b4-7d31-8a7d-aa10-16608bd2130e.jpeg)


時系列データのズームインをし、プロットします。ズームインした期間の拡大図が得られます。

```python
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
plt.xticks(rotation=90)

# ズームイン
df_zoom_in = df['2021-01-01':'2021-01-05']

ax.plot(df_zoom_in.index, df_zoom_in["value01"])
plt.show()
```

![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/ff4afd56-c2ed-bf17-64c5-10a30477ea5b.jpeg)


## 複数変数の時系列プロット

2つの変数value01とvalue02を同時にプロットしてみると、下記のようにvalue01の特徴を見出すことができなくなります。
理由はvalue01の測定値スケールが1～10まで、value02の100～1200よりずっと小さいから。

```python
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
plt.xticks(rotation=90)
ax.plot(df.index, df['value01'])
ax.plot(df.index, df['value02'])
plt.show()
```

![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/aaf36aa1-10f6-9fce-f99f-1f6592983a10.jpeg)


この場合、双軸を使用します。2つの異なるy軸スケールを使用して、同じサブプロットにプロットします。

```python
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
plt.xticks(rotation=90)
ax.plot(df.index, df['value01'], color='b')

# X軸を共有する双軸
ax2 = ax.twinx()

ax2.plot(df.index, df['value02'], color='r')
plt.show()
```

![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/9edbed3f-cd60-6745-22c3-8ed076f6c92a.jpeg)


時系列データを多数プロットする場合、プロット用関数を定義してみます。
[matplotlib.axes.Axes.tick_params](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.axes.Axes.tick_params.html)

```python
def plot_timeseries(axes, x, y, color, xlabel, ylabel):
    axes.plot(x, y, color=color)
    axes.set_xlabel(xlabel)
    axes.set_ylabel(ylabel, color=color)
    axes.tick_params('y', colors=color)
```

定義した関数を使ってみます。

```python
fig, ax = plt.subplots()
plt.xticks(rotation=90)
plot_timeseries(ax, df.index, df['value01'], 'blue', 'Date', 'Value01')
ax2 = ax.twinx()
plot_timeseries(ax2, df.index, df['value02'], 'red', 'Date', 'Value02')
plt.show()
```

![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/aa5c82c3-b796-4451-8a3f-b2dccc95f79b.jpeg)


## 時系列データの注釈

注釈を付けることは、可視化を強化する重要な方法です。特定の部分を参照するテキストでデータのいくつかの特徴を強調でき、その特徴を説明します。

```python
fig, ax = plt.subplots()
plt.xticks(rotation=90)
plot_timeseries(ax, df.index, df['value01'], 'blue', 'Date', 'Value01')
ax2 = ax.twinx()
plot_timeseries(ax2, df.index, df['value02'], 'red', 'Date', 'Value02')

ax2.annotate('annotate day', xy=(pd.Timestamp('2021-01-10'), 900),
             xytext=(pd.Timestamp('2021-01-10'), 200),
             arrowprops={'arrowstyle': '->', 'color': 'gray'})

plt.show()
```

![6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/eae8817a-99a5-298e-a413-91909d9b0237.jpeg)