時系列のグラフを描く

東京の毎日のCOVID-19感染者数の時系列データをプロットしてみましょう。

import matplotlib.pyplot as plt
import pandas as pd

URL = 'https://okumuralab.org/~okumura/python/data/COVID-tokyo.csv'
df = pd.read_csv(URL)

df を眺めてから、プロットしてみましょう。

plt.plot(df['date'], df['confirmed'])

何となくプロットできているようですが、横軸がよくわかりません。日付が文字列になってしまっているようです。日付を日付として読むには、次のようにします。

df = pd.read_csv(URL, parse_dates=['date'])

同じように見えますが、これをプロットしてみましょう。

plt.plot(df['date'], df['confirmed'])

今度は横軸を日付と認識してくれました。でも、重なって読みにくいので、少し傾けてみましょう。

plt.plot(df['date'], df['confirmed'])
plt.xticks(rotation=20)

少し見やすくなりました。

文字を傾けるのが嫌なら、目盛ラベルを一つ置きにしましょう。

plt.plot(df['date'], df['confirmed'])
locs, labels = plt.xticks()
plt.xticks(locs[0::2])

棒グラフも同様です。

plt.bar(df['date'], df['confirmed'], width=1)
plt.xticks(rotation=20)

同様に、厚労省のオープンデータもプロットしてみましょう。

URL1 = 'https://www.mhlw.go.jp/content/pcr_positive_daily.csv'
URL2 = 'https://www.mhlw.go.jp/content/pcr_tested_daily.csv'
df1 = pd.read_csv(URL1, parse_dates=['日付'])
df2 = pd.read_csv(URL2, parse_dates=['日付'])

これらを別々に描いてもいいのですが、マージして一つのデータフレームにしてみましょう。

df = pd.merge(df1, df2)

plt.plot(df['日付'], df['PCR 検査陽性者数(単日)'])
plt.plot(df['日付'], df['PCR 検査実施人数(単日)'])

これではどっちがどっちかわかりませんので、レジェンド(説明)を付けます。

plt.plot(df['日付'], df['PCR 検査陽性者数(単日)'])
plt.plot(df['日付'], df['PCR 検査実施人数(単日)'])
plt.legend(['陽性者数', '実施人数'])

割り算すれば陽性率が出せそうです。

df['陽性率'] = df['PCR 検査陽性者数(単日)'] / df['PCR 検査実施人数(単日)']

陽性率もプロットしてみましょう。でも、データがいいかげんなのでとんでもない値が混じってしまっています。縦軸を0〜1までに制限すると見やすいと思います。

plt.plot(df['日付'], df['陽性率'])
plt.ylim([0, 1])

日付のフォーマットを変えてみましょう。

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

fig, ax = plt.subplots()
formatter = mdates.DateFormatter("%m-%d")
ax.xaxis.set_major_formatter(formatter)

URL = 'https://okumuralab.org/~okumura/python/data/COVID-tokyo.csv'
df = pd.read_csv(URL, parse_dates=['date'])
ax.bar(df['date'], df['confirmed'], width=1)

さらに凝ってみましょう。

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

fig, ax = plt.subplots()
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_formatter(formatter)

URL = 'https://okumuralab.org/~okumura/python/data/COVID-tokyo.csv'
df = pd.read_csv(URL, parse_dates=['date'])
ax.bar(df['date'], df['confirmed'], width=1)

さらにカスタマイズしてみましょう。

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

fig, ax = plt.subplots()
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
formatter.formats=['%Y年', '%m月', '%d日', '%H:%M', '%H:%M', '%S.%f']
formatter.zero_formats=['', '%Y年', '%m月', '%m-%d', '%H:%M', '%H:%M']
formatter.offset_formats=['', '%Y年', '%Y-%m', '%Y-%m-%d',
                          '%Y-%m-%d', '%Y-%m-%d %H:%M']
ax.xaxis.set_major_formatter(formatter)

URL = 'https://okumuralab.org/~okumura/python/data/COVID-tokyo.csv'
df = pd.read_csv(URL, parse_dates=['date'])
ax.bar(df['date'], df['confirmed'], width=1)

Last modified: