環境
Debian Buster(Dockerコンテナ)とJupyter Lab。さらに日本語フォント(Takao)もインストール済み。
グラフで表示するデータ
まずはグラフ表示するデータを用意する。DTW(動的時間伸縮法)で時系列データ間の距離を求めるで作成したcsvを使う。元データは、厚生労働省のホームページ地域ごとの感染状況等の公表についてからダウンロードできる「3.帰国者・接触者相談センターへの相談件数の推移(都道府県別・各日)・帰国者・接触者外来の受診者数の推移・うちPCR検査実施件数の推移(都道府県別・各日) 」のPDFで、これをcsvに変換したもの。全国と各都道府県の日ごとの数値が含まれる。以下はExcelで開いた状態。
注釈のデータ
今回は主なニュースを注釈としてグラフ上に表示させる。グラフで表示するデータが日ごとの数値なので、日にちをキーとするPythonの辞書型でデータを用意する。
from datetime import datetime as dt # グラフ上に表示するイベント events = { dt(2020, 5, 2): '国内死者500人超え', dt(2020, 5, 4): '緊急事態宣言を5月31日まで延長', dt(2020, 5, 14): '39県で緊急事態宣言解除を決定', dt(2020, 5, 21): '京都、大阪、兵庫の緊急事態宣言解除を決定', dt(2020, 5, 25): '北海道および首都圏の1都3県緊急事態宣言解除を決定', }
グラフ用データの読み込み
PDFから抽出したデータを保存したcsv(000643758.csv)を読み込んで、このcsvに含まれる全国の「帰国者・接触者相談センター(全相談件数)」を使う。期間は5月のひと月分。日ごとのデータなので、日をインデックスとするPandasのDataFrameにする。
%matplotlib inline from datetime import datetime as dt import pandas as pd import matplotlib.pyplot as plt # 日本語フォントの指定 plt.rcParams['font.family'] = 'TakaoGothic' DT_FROM = '2020-05-01' DT_TO = '2020-05-30' def load_csv(csvpath): df = pd.read_csv(csvpath, index_col=0, header=[0,1], parse_dates=True, encoding='shift-jis') # 全国の「帰国者・接触者相談センター(全相談件数)」だけを選択 df_con = df.loc[:, [('全国', '帰国者・接触者相談センター(全相談件数)')]] # カラムのレベルを全国のみにする df_con.columns = df_con.columns.droplevel(level=1) return df_con[DT_FROM:DT_TO] df = load_csv('000643758.csv') df.plot() plt.show()
プロットすると以下のようになる。
グラフ上に矢印付きの注釈を表示
はじめに折れ線グラフを表示し、さらにその上に辞書型の注釈データを使って矢印つき注釈を表示する。
%matplotlib inline from datetime import datetime as dt import pandas as pd import matplotlib.pyplot as plt # 日本語フォントの指定 plt.rcParams['font.family'] = 'TakaoGothic' DT_FROM = '2020-05-01' DT_TO = '2020-05-30' # グラフ上に表示するイベント events = { dt(2020, 5, 2): '国内死者500人超え', dt(2020, 5, 4): '緊急事態宣言を5月31日まで延長', dt(2020, 5, 14): '39県で緊急事態宣言解除を決定', dt(2020, 5, 21): '京都、大阪、兵庫の緊急事態宣言解除を決定', dt(2020, 5, 25): '北海道および首都圏の1都3県緊急事態宣言解除を決定', } def load_csv(csvpath): df = pd.read_csv(csvpath, index_col=0, header=[0,1], parse_dates=True, encoding='shift-jis') # 全国の「帰国者・接触者相談センター(全相談件数)」だけを選択 df_con = df.loc[:, [('全国', '帰国者・接触者相談センター(全相談件数)')]] # カラムのレベルを全国のみにする df_con.columns = df_con.columns.droplevel(level=1) return df_con[DT_FROM:DT_TO] df = load_csv('000643758.csv') df.plot() # y軸の最大値 mx = df.max() # イベントを注釈としてグラフに追加 for d, annot in events.items(): # イベント日に縦の点線を描く plt.axvline(x=d, color='black', linestyle='--', alpha=0.5) # プロットのy軸上の位置 if d in df.index: y = df.loc[d] else: continue # プロット値の上部に注釈と矢印を表示 plt.annotate(annot, xy=(d, y+mx*0.1), xytext=(d, y+mx*0.2), arrowprops=dict(color='red', headwidth=4, width=2, headlength=4), horizontalalignment='left', verticalalignment='top') plt.legend() plt.show()
以下のようにグラフ上に矢印つきの注釈が表示された。
0 件のコメント:
コメントを投稿