環境
Debian Buster(Dockerコンテナ)とJupyter Lab。さらに日本語フォント(Takao)もインストール済み。
グラフで表示するデータ
まずはグラフ表示するデータを用意する。DTW(動的時間伸縮法)で時系列データ間の距離を求めるで作成したcsvを使う。元データは、厚生労働省のホームページ地域ごとの感染状況等の公表についてからダウンロードできる「3.帰国者・接触者相談センターへの相談件数の推移(都道府県別・各日)・帰国者・接触者外来の受診者数の推移・うちPCR検査実施件数の推移(都道府県別・各日) 」のPDFで、これをcsvに変換したもの。全国と各都道府県の日ごとの数値が含まれる。以下はExcelで開いた状態。

注釈のデータ
今回は主なニュースを注釈としてグラフ上に表示させる。グラフで表示するデータが日ごとの数値なので、日にちをキーとするPythonの辞書型でデータを用意する。
1 2 3 4 5 6 7 8 9 | 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にする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | % 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() |
プロットすると以下のようになる。

グラフ上に矢印付きの注釈を表示
はじめに折れ線グラフを表示し、さらにその上に辞書型の注釈データを使って矢印つき注釈を表示する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | % 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 件のコメント:
コメントを投稿