Open Data API Portalの厚生労働省 新型コロナ関連オープンデータAPIを試してみる その2:Matplotlibを使ってグラフ化してみる

目次

Open Data API Portal

前回、Open Data API Portalの新型コロナ関連オープンデータAPIの使い方を勉強してみました。

データ取得のために、自分が使いやすいように書き換えたプログラムがこちらです。

<セル1>

import requests
import json

apikey = 'YOUR_API_KEY'

url = f'https://api.opendata.go.jp/mhlw/death-cases?apikey={apikey}'

requestHeaders = {
    "Accept": "application/json"
}

request = requests.get(url, headers=requestHeaders)

if request.status_code == 200:
    data = json.loads(request.content.decode())
    print(data)
else:
    print(request.status_code)

今回はここから得られたデータをグラフにしていきましょう。

グラフ化するためのデータの処理

まずはグラフ化するためにデータを処理していきます。

先ほどの<セル1>のプログラムを実行するとこんな結果が表示されます。

[{'日付': '2020/2/14', '死亡者数': '1'}, {'日付': '2020/2/15', '死亡者数': '1'}, 
{'日付': '2020/2/16', '死亡者数': '1'}, {'日付': '2020/2/17', '死亡者数': '1'}, 
{'日付': '2020/2/18', '死亡者数': '1'}, {'日付': '2020/2/19', '死亡者数': '1'}, 
{'日付': '2020/2/20', '死亡者数': '1'}, {'日付': '2020/2/21', '死亡者数': '1'}, 
{'日付': '2020/2/22', '死亡者数': '1'}, {'日付': '2020/2/23', '死亡者数': '1'}, 
{'日付': '2020/2/24', '死亡者数': '1'}, {'日付': '2020/2/25', '死亡者数': '1'}, 
{'日付': '2020/2/26', '死亡者数': '1'}, {'日付': '2020/2/27', '死亡者数': '3'}, 
{'日付': '2020/2/28', '死亡者数': '4'}, {'日付': '2020/2/29', '死亡者数': '5'}, 
{'日付': '2020/3/1', '死亡者数': '5'}, (以下略)

つまり1日毎のデータがリスト形式で格納されていて、その1日のデータは辞書形式で「日付」と「死亡者数」として格納されているわけです。

そのため、最初の日の日付、死亡者数を取得するにはこう表記しました。

print(data[0]['日付'])

実行結果
2020/2/14
print(data[0]['死亡者数'])

実行結果
1

このままではmatplotlibでグラフ化できませんので、日付と死亡者数をそれぞれリストへと変換する必要があります。

ということでfor関数を使ってこんな感じにしてみました。

<セル2>

date = []; death = []

for oneday in data:
    date.append(oneday['日付'])
    death.append(int(oneday['死亡者数']))

for関数で1日ごとのデータを取得し、辞書のキーでそれぞれ日付と死亡者数を取得します。

そしてそれぞれをリストdataとdeathに格納していきます。

これで日付だけのリストと死亡者数だけのリストを作ることができます。

グラフ化

次にmatplotlibを使ってグラフ化していきます。

matplotlibに関しては、このシリーズの記事で解説していますので、良かったらどうぞ。

ということで作成したプログラムがこちら。

<セル3>

import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

fig = plt.figure()
plt.clf()

plt.plot(date, death)

plt.xticks(np.arange(0, len(date)+1, 30),rotation=90)

plt.tight_layout()

最後は

今回はインポートするライブラリとしては、numpyとmatplotlibです。

import numpy as np
from matplotlib import pyplot as plt

そしてJupyter notebook上でグラフを表示するためのマジックコマンドを記載しています。

%matplotlib inline

最初の2行はmaplotlibでグラフ表示する際のお決まりのコマンドです。

fig = plt.figure()
plt.clf()

1行目でグラフ表示の領域を設定し、2行目で領域内のグラフを初期化しています(念の為)。

グラフ作成のコマンドは「plt.plot(Xの値、Yの値)」なのでこれだけ。

plt.plot(date, death)

そして最後のコマンドでグラフを表示です。

plt.tight_layout()

ちなみにグラフの表示には「plt.show()」でもいいのですが、たまに軸名やラベルがはみ出します。

その場合「plt.tight_layout()」を使うと、はみ出さないように調節してくれるので、おすすめです。

このプログラムを実行し、グラフを表示したのがこちらです。

このグラフを見て初めて「死亡者数」は累積の死亡者数だと気づいたのは内緒です。

X軸の表示を飛び飛びにする

実は先ほどのプログラムの解説の中で1行飛ばしました。

それはこちらの行です。

plt.xticks(np.arange(0, len(date)+1, 30),rotation=90)

ここではX軸に表示する値の調整を2つ行なっています。

一つ目が「np.arange(0, len(date)+1, 30)」の部分、二つ目が「rotation=90」の部分です。

二つ目の「rotation」に関しては前に一度使っていたりしますが、X軸の値を表示する角度を変えることができるオプションです。

先ほどは「rotation=90」として90度傾けていますが、オプションを付けていない、つまりデフォルトである「rotation=0」の場合はグラフの表示はこうなります。

import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

fig = plt.figure()
plt.clf()

plt.plot(date, death)

plt.xticks(np.arange(0, len(date)+1, 30))

plt.tight_layout()

実行結果

X軸の値が重なってしまって見えませんね。

もう一つ、45度にしてみるとどうなるでしょうか。

import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

fig = plt.figure()
plt.clf()

plt.plot(date, death)

plt.xticks(np.arange(0, len(date)+1, 30), rotation=45)

plt.tight_layout()

実行結果

こちらでもなかなかいい見栄えです。

通常は指定なしの0度か45度、90度あたりを使うのがいいのではないでしょうか。

解説が逆になってしまいましたが、次に一つ目の「np.arange(0, len(date)+1, 30)」を解説していきます。

もしこのオプションを付けない場合はこうなります。

import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

fig = plt.figure()
plt.clf()

plt.plot(date, death)

plt.xticks(np.arange(0, len(date), 30), rotation=90)

plt.tight_layout()

実行結果

そう、X軸の値が全て表示されてしまい、なにも見えなくなってしまうのです。

ということで「np.arange(0, len(date)+1, 30)」のオプションはX軸の値を飛び飛びで表示するためのものなのです。

np.arrange自体はrangeと似た機能を持つコマンドで、「np.arange(開始の数, 終了の数, ステップ)」で、飛び飛びの値を取得することができます。

「np.arange(0, len(date)+1, 30)」の場合は、0からdataの要素数+1までを30刻みで取得していく、ということになります。

そのため、最初のプログラムの実行結果では30日刻みでX軸が表示されていたというわけです。

ちなみに調べた時にnp.arangeを使っているサイトが多かったので、np.arangeを使ってしまいましたが、rangeでも問題なく表示されました。

from matplotlib import pyplot as plt
%matplotlib inline

fig = plt.figure()
plt.clf()

plt.plot(date, death)

plt.xticks(range(0, len(date), 30), rotation=90)

plt.tight_layout()

実行結果

これでまずは累積の死者数のグラフを作成することができました。

次回は累積ではなく、1日の死亡者数のグラフを作成してみましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる