新型コロナ陽性者数のアニメーショングラフを作成する
国内の新型コロナ陽性者数のアニメーショングラフを作成します。通常グラフ作成はmatplotlibを用いますが体裁を整えるのが結構手間だったりします。ここではpilowで画像としてグラフを作成します。一日ごと感染者数を棒グラフ表示するgifアニメーションを作成します。
関連記事
環境
- windows10 home
- Anaconda 3/ jupyter notebook 5.6.0
- Python 3.7.0
- Pillow 5.2.0
準備
陽性者数のデータとして厚生労働省オープンデータに掲載されている陽性者数のcsvファイル'pcr_positive_daily.csv'をダウンロードしjupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。ファイルには下のように日付とPCR検査陽性者数が書かれています。
日付,PCR 検査陽性者数(単日)
2020/1/16,1
2020/1/17,0
2020/1/18,0
2020/1/19,0
コード
まずライブラリcsvを使ってcsvファイルを読み出します。日付と陽性者数を取り出しリスト化します。日付を一日づつずらしながら設定した日付までのグラフ画像を作成し画像をリストに追加します。全データについての画像を追加したらそれらを使ってgifアニメーションを作成します。また日付と陽性者数を画像の左上に文字で表示します。
import csv import math from PIL import Image, ImageDraw, ImageFont # csvファイルを読み出し日付・陽性者数のリストを作る date_list = [] positive_list = [] with open('pcr_positive_daily.csv', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: date_list.append(row[0]) positive_list.append(row[1]) # 日付を一日づつずらしながら設定した日付までの感染者数棒グラフを描画し画像リストに保存 img_list = [] # 画像保存用リスト font = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 18) # フォントの指定(メイリオ18pt) for i in range(1,len(positive_list)): im = Image.new('RGB', (800, 200), (255, 255, 255)) draw = ImageDraw.Draw(im) draw.rectangle(((10, 10), (790, 190)), fill=(255, 255, 255), outline=(0, 0, 0)) draw.multiline_text((20, 15), '国内陽性者数の推移', fill=(0, 0, 0), font=font) # タイトルの描画 draw.multiline_text((20, 40), date_list[i], fill=(0, 0, 0), font=font) # 日付の描画 draw.multiline_text((140, 40), '陽性者数(人) '+positive_list[i], fill=(0, 0, 0), font=font) # 感染者数描画 for j in range(1,i): dy = math.ceil(int(positive_list[j])/20) draw.rectangle(((11+2*j, 189-dy), (13+2*j, 189)), fill=(0, 0, 0), outline=(0, 0, 0)) img_list.append(im) # 見やすいように最後の1枚のグラフを40回繰り返し表示する for i in range(40): img_list.append(im) # gifアニメーションファイルの保存(一画像あたり100ms、ループあり) img_list[0].save('covid19.gif', save_all=True, append_images=img_list[1:], optimize=True, duration=100, loop=0)
実行結果
gifアニメーションファイル'covid19.gif'が保存されます。
以下のサイトを参考にさせていただきました
厚生労働省オープンデータ
Pythonの文法メモ >> 【Pillow】ImageDrawモジュールによる直線、四角、円、多角形描画