ここではWebサイトで公開されて生データを使用してMatplotlibのstackplot()メソッドで積み重ね折れ線グラフを作成する方法を解説します。
積み重ね折れ線グラフはプロジェクト管理で担当者別の作業時間などのグラフを作成するときに利用すると便利です。
また、「日課」などの内訳をグラフで作成するといった使い方もできます。
最初に厚労省のWebサイトからCOVID-19のデータをダウンロードしてMatplotlibのstackplot()メソッドで都道府県別に感染者、重症者、死亡者などの累計を積み重ね折れ線グラフで作成します。
また、GAFAなどの株価やBitcoinなどの仮想通貨(暗号通貨)の価格に積み重ね折れ線グラフを適用する方法も紹介します。
厚労省のWebサイトからCOVIC-19のデータをダウンロードするにはPandasのread_csv()メソッドを使用します。
read_csv()の引数にCSVファイルのURLを指定すると手動でダウンロードすることなく完全に自動化できます。
なお、COVIC-19のデータは「記事(Article013)」で作成しています。
事前に「記事(Article013)」で解説している手順でCSVファイルを作成しておいてください。
Yahoo! FinanceのWebサイトから株価や仮想通貨(暗号通貨)の価格をダウンロードするにはPandasのDataReaderを使用します。
DataReader()で株価をダウンロードするには引数に企業のティッカーシンボル(Apple▶AAPL)、開始日、終了日を指定します。
Yahoo! FinanceのWebサイトから仮想通貨(暗号通貨)の価格をダウンロードする場合も株価と同様PandasのDataReaderを使用します。
ビットコインの価格をダウンロードするにはDataReader()の引数に「BTC-JPY」「BTC-USD」のように指定します。
つまり、日本円に換算するときは「BTC-JPY」、米ドルに換算するときは「BTC-USD」のように指定します。
株価も仮想通貨(暗号通貨)の価格をダウンロードするのも完全に自動化できますので手動でダウンロードする必要はありません。
ここではVisula Studio Code(VSC)の「Python Interactive window」
を使用してJupter(IPython Notebook)のような環境で説明します。
VSCを通常の環境からインタラクティブな環境に切り換えるにはコードを記述するときコメント「# %%」を入力します。
詳しい、操作手順については「ここ」
を参照してください。
インタラクティブな環境では、Pythonの「print(), plt.show()」などを使う必要がないので掲載しているコードでは省略しています。
VSCで通常の環境で使用するときは、必要に応じて「print(), plt.show()」等を追加してください。
この記事では、Pandas、Matplotlibのライブラリを使用しますので
「記事(Article001) | 記事(Article002) | 記事(Article003) | 記事(Article004)」
を参照して事前にインストールしておいてください。
Pythonのコードを入力するときにMicrosoftのVisula Studio Codeを使用します。
まだ、インストールしていないときは「記事(Article001)」を参照してインストールしておいてください。
説明文の左側に図の画像が表示されていますが縮小されています。
画像を拡大するにはマウスを画像上に移動してクリックします。
画像が拡大表示されます。拡大された画像を閉じるには右上の[X]をクリックします。
画像の任意の場所をクリックして閉じることもできます。
-
ゲームの得点をプレイヤー別に積み重ね折れ線グラフで表示する
Visual Studio Codeを起動したら以下のコードを入力して実行[Ctrl+Enter]します。
行3ではPythonのライブラリを取り込んでいます。
行7ではX軸のデータを定義しています。ここでは経過時間を分単位で定義しています。
行9-11ではゲームのプレイヤー別の得点を定義しています。
行13ではMatplotlibのstackplot()メソッドで積み重ね折れ線グラフを作成しています。
引数1にはX軸の値を指定しています。
引数2-4にはY軸の値を指定しています。ここでは3人のプレイヤーの得点を指定しています。
行15ではMatplotlibのshow()メソッドでグラフを表示しています。
# Article019_Matplotlib Stack Plots Part0.py
# %%
from matplotlib import pyplot as plt
# 1) Draw a simple stack chart
minutes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
player1 = [1, 2, 3, 3, 4, 4, 4, 4, 5]
player2 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
player3 = [1, 1, 1, 2, 2, 2, 3, 3, 3]
plt.stackplot(minutes, player1, player2, player3)
plt.show()
# %%
図1は実行結果です。3人のプレイヤーの得点が表示されています。
-
積み重ね折れ線グラフにオプション(スタイル、タイトル、ラベル、凡例など)を追加する
行3ではMatplotlibのstyle.use()メソッドでスタイル「fivethirtyeight」を指定しています。
スタイルの一覧はインタラクティブ・ウィンドウから「style.available」を入力して実行「Shift+Enter」すると表示されます。
行11ではグラフに表示する凡例を定義しています。
ここで定義した凡例は行13のstackplot()の引数「labels=labels」で指定します。
行15-18ではグラフのX軸、Y軸のラベル、凡例の表示位置、タイトルを設定しています。
行19ではMatplotlibのtight_layout()メソッドでNOTE-PCなどに表示したときもグラフが綺麗に表示されるようにしています。
# 2) Add options(style, lables, legend, title,...)
plt.style.use("fivethirtyeight")
minutes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
player1 = [1, 2, 3, 3, 4, 4, 4, 4, 5]
player2 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
player3 = [1, 1, 1, 2, 2, 2, 3, 3, 3]
labels = ['player1','player2','player3']
plt.stackplot(minutes, player1, player2, player3, labels=labels)
plt.xlabel('Minutes')
plt.ylabel('Scores')
plt.legend(loc='upper left')
plt.title('Game Scoring Stack Plot')
plt.tight_layout()
plt.show()
図2は実行結果です。グラフにX軸、Y軸のラベル、凡例、タイトルが表示されています。
-
積み重ね折れ線グラフのデフォルの色を変える
行12ではグラフの色を定義しています。
ここで定義した色はstackplot()の引数「colors=colors」で指定します。
# 3) Change the default colors
plt.style.use("fivethirtyeight")
minutes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
player1 = [1, 2, 3, 3, 4, 4, 4, 4, 5]
player2 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
player3 = [1, 1, 1, 2, 2, 2, 3, 3, 3]
labels = ['player1','player2','player3']
colors = ['#6d904f','#fc4f30','#008fd5']
plt.stackplot(minutes, player1, player2, player3,
labels=labels, colors=colors)
plt.xlabel('Minutes')
plt.ylabel('Scores')
plt.legend(loc='upper left')
plt.title('Game Scoring Stack Plot')
plt.tight_layout()
plt.show()
図3は実行結果です。プレイヤー1-3の色が変更されました。
-
プロジェクト管理で開発者別の作業時間を積み重ね折れ線グラフで表示する
行5ではX軸の値(日付)を定義しています。
行7-9ではY軸の値(作業時間)を定義しています。
行17ではMatplotlibのmargins()メソッドでグラフのX軸のマージンを「0」に設定して凡例がグラフ内に表示されるようにしています。
この設定を行わないと凡例がグラフの外にはみ出してしまいます。
デフォルトの設定ではマージンが確保されます。
デフォルトのマージンを使用するときは凡例が図からはみ出さないようにMatplotlibのlegend()メソッドに
「loc=(0.07, 0.05)」を指定して凡例の位置を調整する必要があります。
# 4) Plots the Project data
plt.style.use("fivethirtyeight")
days = [1, 2, 3, 4, 5, 6, 7, 8, 9]
developer1 = [8, 6, 5, 5, 4, 2, 1, 1, 0]
developer2 = [0, 1, 2, 2, 2, 4, 4, 4, 4]
developer3 = [0, 1, 1, 1, 2, 2, 3, 3, 4]
labels = ['developer1','developer2','developer3']
colors = ['#6d904f','#fc4f30','#008fd5']
plt.stackplot(days, developer1, developer2, developer3,
labels=labels, colors=colors)
plt.margins(x=0)
plt.legend(loc='lower left') #plt.legend(loc=(0.07, 0.05))
plt.xlabel('Days')
plt.ylabel('Hours')
plt.title('Project Management\n(Work Time by Developer)')
plt.tight_layout()
plt.show()
図4は実行結果です。開発者別の作業時間がグラフ化されて表示されています。
また、凡例がグラフ内に表示されています。
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# Article019_Matplotlib Stack Plots Part0.py
# %%
from matplotlib import pyplot as plt
# 1) Draw a simple stack chart
minutes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
player1 = [1, 2, 3, 3, 4, 4, 4, 4, 5]
player2 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
player3 = [1, 1, 1, 2, 2, 2, 3, 3, 3]
plt.stackplot(minutes, player1, player2, player3)
plt.show()
# %%
# 2) Add options(style, lables, legend, title,...)
plt.style.use("fivethirtyeight")
minutes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
player1 = [1, 2, 3, 3, 4, 4, 4, 4, 5]
player2 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
player3 = [1, 1, 1, 2, 2, 2, 3, 3, 3]
labels = ['player1','player2','player3']
plt.stackplot(minutes, player1, player2, player3, labels=labels)
plt.xlabel('Minutes')
plt.ylabel('Scores')
plt.legend(loc='upper left')
plt.title('Game Scoring Stack Plot')
plt.tight_layout()
plt.show()
# %%
# 3) Change the default colors
plt.style.use("fivethirtyeight")
minutes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
player1 = [1, 2, 3, 3, 4, 4, 4, 4, 5]
player2 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
player3 = [1, 1, 1, 2, 2, 2, 3, 3, 3]
labels = ['player1','player2','player3']
colors = ['#6d904f','#fc4f30','#008fd5']
plt.stackplot(minutes, player1, player2, player3,
labels=labels, colors=colors)
plt.legend(loc='upper left')
plt.xlabel('Minutes')
plt.ylabel('Scores')
plt.title('Game Scoring Stack Plot')
plt.tight_layout()
plt.show()
# %%
# 4) Plots the Project data
plt.style.use("fivethirtyeight")
days = [1, 2, 3, 4, 5, 6, 7, 8, 9]
developer1 = [8, 6, 5, 5, 4, 2, 1, 1, 0]
developer2 = [0, 1, 2, 2, 2, 4, 4, 4, 4]
developer3 = [0, 1, 1, 1, 2, 2, 3, 3, 4]
labels = ['developer1','developer2','developer3']
colors = ['#6d904f','#fc4f30','#008fd5']
plt.stackplot(days, developer1, developer2, developer3,
labels=labels, colors=colors)
plt.margins(x=0)
plt.legend(loc='lower left') #plt.legend(loc=(0.07, 0.05))
plt.xlabel('Days')
plt.ylabel('Hours')
plt.title('Project Management\n(Work Time by Developer)')
plt.tight_layout()
plt.show()
# %%
-
COVID-19のCSVファイルを取り込んでPandasのDataFrameに格納する
行4-13ではPythonのライブラリを取り込んでいます。
行14ではPythonの警告を抑止しています。
行19ではCSVファイルのパスを定義しています。
行21ではPandasのread_csv()メソッドでCOVID-19のデータを取り込んでDataFrameに格納しています。
引数1にはCSVファイルのパスを指定しています。
引数2には「parse_dates=['date']」を指定して日付をstr型からdatetime64型に変換するようにしています。
COVID-19のデータは当サイトに用意しているので行19をコメントにして行20のコメントを外してください。
これで当サイトからCSVファイルをダウンロードします。
# Article019_Matplotlib Stack Plots Part2 COVID-19(1).py
# %%
# Import the necessary libraries
from os import terminal_size
import pandas as pd
from pandas.core.frame import DataFrame
import pandas_datareader.data as web # pip install pandas_datareader
import matplotlib.pyplot as plt
import matplotlib.dates as mpl_dates
import matplotlib.style as style
from datetime import datetime, timedelta
import numpy as np
import warnings
warnings.simplefilter('ignore')
# %%
# 0) Load the csv files
csv_file = 'data/csv/covid-19/japan/combined_v2.csv'
#csv_file = 'https://money-or-ikigai.com/menu/python/article/data/covid-19/combined_v2.csv'
raw = pd.read_csv(csv_file, parse_dates=['date'])
-
COVID-19のデータを加工する
ここでは縦型に格納されているデータをPIVOT型に変換しています。
ステップ1で取り込んだCSVファイルは「prefecture, date, new_cases, total_cases, ...」のようになっています。
これを行から列にPIVOTさせて「date, new_cases_tokyo, total_cases_tokyo, ...」のように加工します。
# 1) Create a CSV file 'data/csv/covid-19/japan/combined2.csv'
df = raw
prefs = ['Tokyo','Osaka', 'Kyoto','Hyogo','Aichi', 'Saitama','Kanagawa','Chiba']
for pref in prefs:
filter_by = filter_by = (df['prefecture'] == pref)
dfx = df[filter_by]
pref = pref.lower()
dfx.rename(columns={
'total_cases': f'total_cases_{pref}',
'total_deaths': f'total_deaths_{pref}',
'total_severe_cases': f'total_severe_cases_{pref}'
}, inplace=True)
dfx = dfx[['date', f'total_cases_{pref}', f'total_deaths_{pref}', f'total_severe_cases_{pref}']]
dfx.set_index('date')
if pref == 'tokyo':
dfall = dfx
else:
dfall = pd.merge(dfall, dfx)
csv_file = 'data/csv/covid-19/japan/combined3.csv'
dfall.to_csv(csv_file, index=False)
-
累計感染者の積み重ね折れ線グラフを作成して都道府県別に比較する(東京/大阪/愛知)
# 2) Draw a simple stack chart : new cases (tokyo, osaka, aichi)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
tokyo_total_cases = dfx.total_cases_tokyo.values[0].round(0)
osaka_total_cases = dfx.total_cases_osaka.values[0].round(0)
aichi_total_cases = dfx.total_cases_aichi.values[0].round(0)
labels = [
f'東京({tokyo_total_cases:,})',
f'大阪({osaka_total_cases:,})',
f'愛知({aichi_total_cases:,})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_cases_tokyo, dfx.total_cases_osaka, dfx.total_cases_aichi,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計感染者 (東京/大阪/愛知)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
-
累計感染者の積み重ね折れ線グラフを作成して都道府県別に比較する(神奈川/埼玉/千葉)
# 3) Draw a simple stack chart : new cases (kanagawa, saitama, chiba)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
kanagawa_total_cases = dfx.total_cases_kanagawa.values[0].round(0)
saitama_total_cases = dfx.total_cases_saitama.values[0].round(0)
chiba_total_cases = dfx.total_cases_chiba.values[0].round(0)
labels = [
f'神奈川({kanagawa_total_cases:,})',
f'埼玉({saitama_total_cases:,})',
f'千葉({chiba_total_cases:,})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_cases_kanagawa, dfx.total_cases_saitama, dfx.total_cases_chiba,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計感染者 (神奈川/埼玉/千葉)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
-
累計感染者の積み重ね折れ線グラフを作成して都道府県別に比較する(大阪/兵庫/京都)
# 4) Draw a simple stack chart : new cases (Osaka, Hyogo, Kyoto)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
osaka_total_cases = dfx.total_cases_osaka.values[0].round(0)
hyogo_total_cases = dfx.total_cases_hyogo.values[0].round(0)
kyoto_total_cases = dfx.total_cases_kyoto.values[0].round(0)
labels = [
f'大阪({osaka_total_cases:,})',
f'兵庫({hyogo_total_cases:,})',
f'京都({kyoto_total_cases:,})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_cases_osaka, dfx.total_cases_hyogo, dfx.total_cases_kyoto,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計感染者 (大阪/兵庫/京都)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# Article019_Matplotlib Stack Plots Part2 COVID-19(1).py
# %%
# Import the necessary libraries
from os import terminal_size
import pandas as pd
from pandas.core.frame import DataFrame
import pandas_datareader.data as web # pip install pandas_datareader
import matplotlib.pyplot as plt
import matplotlib.dates as mpl_dates
import matplotlib.style as style
from datetime import datetime, timedelta
import numpy as np
import warnings
warnings.simplefilter('ignore')
# %%
# 0) Load the csv files
csv_file = 'data/csv/covid-19/japan/combined_v2.csv'
#csv_file = 'https://money-or-ikigai.com/menu/python/article/data/covid-19/combined_v2.csv'
raw = pd.read_csv(csv_file, parse_dates=['date'])
#raw.info()
#raw.head()
# %%
# 1) Create a CSV file 'data/csv/covid-19/japan/combined2.csv'
df = raw
prefs = ['Tokyo','Osaka', 'Kyoto','Hyogo','Aichi', 'Saitama','Kanagawa','Chiba']
for pref in prefs:
# Filter prefecture
filter_by = filter_by = (df['prefecture'] == pref)
dfx = df[filter_by]
pref = pref.lower()
dfx.rename(columns={
'total_cases': f'total_cases_{pref}',
'total_deaths': f'total_deaths_{pref}',
'total_severe_cases': f'total_severe_cases_{pref}'
}, inplace=True)
dfx = dfx[['date', f'total_cases_{pref}', f'total_deaths_{pref}', f'total_severe_cases_{pref}']]
dfx.set_index('date')
if pref == 'tokyo':
dfall = dfx
else:
dfall = pd.merge(dfall, dfx)
csv_file = 'data/csv/covid-19/japan/combined3.csv'
dfall.to_csv(csv_file, index=False)
# %%
# 2) Draw a simple stack chart : new cases (tokyo, osaka, aichi)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
tokyo_total_cases = dfx.total_cases_tokyo.values[0].round(0)
osaka_total_cases = dfx.total_cases_osaka.values[0].round(0)
aichi_total_cases = dfx.total_cases_aichi.values[0].round(0)
labels = [
f'東京({tokyo_total_cases:,})',
f'大阪({osaka_total_cases:,})',
f'愛知({aichi_total_cases:,})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_cases_tokyo, dfx.total_cases_osaka, dfx.total_cases_aichi,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計感染者 (東京/大阪/愛知)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
# %%
# 3) Draw a simple stack chart : new cases (kanagawa, saitama, chiba)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
kanagawa_total_cases = dfx.total_cases_kanagawa.values[0].round(0)
saitama_total_cases = dfx.total_cases_saitama.values[0].round(0)
chiba_total_cases = dfx.total_cases_chiba.values[0].round(0)
labels = [
f'神奈川({kanagawa_total_cases:,})',
f'埼玉({saitama_total_cases:,})',
f'千葉({chiba_total_cases:,})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_cases_kanagawa, dfx.total_cases_saitama, dfx.total_cases_chiba,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計感染者 (神奈川/埼玉/千葉)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
# %%
# 4) Draw a simple stack chart : new cases (Osaka, Hyogo, Kyoto)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
osaka_total_cases = dfx.total_cases_osaka.values[0].round(0)
hyogo_total_cases = dfx.total_cases_hyogo.values[0].round(0)
kyoto_total_cases = dfx.total_cases_kyoto.values[0].round(0)
labels = [
f'大阪({osaka_total_cases:,})',
f'兵庫({hyogo_total_cases:,})',
f'京都({kyoto_total_cases:,})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_cases_osaka, dfx.total_cases_hyogo, dfx.total_cases_kyoto,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計感染者 (大阪/兵庫/京都)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
# %%
-
累計重症者の積み重ね折れ線グラフを作成して都道府県別に比較する(東京/大阪/愛知)
-
累計重症者の積み重ね折れ線グラフを作成して都道府県別に比較する(神奈川/埼玉/千葉)
-
累計重症者の積み重ね折れ線グラフを作成して都道府県別に比較する(大阪/兵庫/京都)
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# Article019_Matplotlib Stack Plots Part2 COVID-19(2).py
# %%
# Import the necessary libraries
from os import terminal_size
import pandas as pd
from pandas.core.frame import DataFrame
import pandas_datareader.data as web # pip install pandas_datareader
import matplotlib.pyplot as plt
import matplotlib.dates as mpl_dates
import matplotlib.style as style
from datetime import datetime, timedelta
import numpy as np
import warnings
warnings.simplefilter('ignore')
# %%
# 0) Load the csv files
csv_file = 'data/csv/covid-19/japan/combined_v2.csv'
#csv_file = 'https://money-or-ikigai.com/menu/python/article/data/covid-19/combined_v2.csv'
raw = pd.read_csv(csv_file, parse_dates=['date'])
#raw.info()
#raw.head()
# %%
# 1) Create a CSV file 'data/csv/covid-19/japan/combined2.csv'
df = raw
prefs = ['Tokyo','Osaka', 'Kyoto','Hyogo','Aichi', 'Saitama','Kanagawa','Chiba']
for pref in prefs:
# Filter prefecture
filter_by = filter_by = (df['prefecture'] == pref)
dfx = df[filter_by]
pref = pref.lower()
dfx.rename(columns={
'total_cases': f'total_cases_{pref}',
'total_deaths': f'total_deaths_{pref}',
'total_severe_cases': f'total_severe_cases_{pref}'
}, inplace=True)
dfx = dfx[['date', f'total_cases_{pref}', f'total_deaths_{pref}', f'total_severe_cases_{pref}']]
dfx.set_index('date')
if pref == 'tokyo':
dfall = dfx
else:
dfall = pd.merge(dfall, dfx)
csv_file = 'data/csv/covid-19/japan/combined2.csv'
dfall.to_csv(csv_file, index=False)
# %%
# 2) Draw a simple stack chart : new cases (tokyo, osaka, aichi)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
tokyo_total_severe_cases = dfx.total_severe_cases_tokyo.values[0].round(0)
osaka_total_severe_cases = dfx.total_severe_cases_osaka.values[0].round(0)
aichi_total_severe_cases = dfx.total_severe_cases_aichi.values[0].round(0)
#labels = ['Tokyo','Osaka','Aichi']
labels = [
f'東京({tokyo_total_severe_cases:,.0f})',
f'大阪({osaka_total_severe_cases:,.0f})',
f'愛知({aichi_total_severe_cases:,.0f})'
]
filter_by = (df['date'] >= '2021-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_severe_cases_tokyo, dfx.total_severe_cases_osaka, dfx.total_severe_cases_aichi,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
#plt.yscale('log')
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計重症者 (東京/大阪/愛知)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
# %%
# 3) Draw a simple stack chart : new cases (kanagawa, saitama, chiba)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
kanagawa_total_severe_cases = dfx.total_severe_cases_kanagawa.values[0].round(0)
saitama_total_severe_cases = dfx.total_severe_cases_saitama.values[0].round(0)
chiba_total_severe_cases = dfx.total_severe_cases_chiba.values[0].round(0)
#labels = ['Kanagawa','Saitama','Chiba']
labels = [
f'神奈川({kanagawa_total_severe_cases:,.0f})',
f'埼玉({saitama_total_severe_cases:,.0f})',
f'千葉({chiba_total_severe_cases:,.0f})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_severe_cases_kanagawa, dfx.total_severe_cases_saitama, dfx.total_severe_cases_chiba,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
#plt.yscale('log')
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計重症者 (神奈川/埼玉/千葉)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
# %%
# 4) Draw a simple stack chart : new cases (Osaka, Hyogo, Kyoto)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
osaka_total_severe_cases = dfx.total_severe_cases_osaka.values[0].round(0)
hyogo_total_severe_cases = dfx.total_severe_cases_hyogo.values[0].round(0)
kyoto_total_severe_cases = dfx.total_severe_cases_kyoto.values[0].round(0)
#labels = ['Osaka','Hyogo','Kyoto']
labels = [
f'大阪({osaka_total_severe_cases:,.0f})',
f'兵庫({hyogo_total_severe_cases:,.0f})',
f'京都({kyoto_total_severe_cases:,.0f})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_severe_cases_osaka, dfx.total_severe_cases_hyogo, dfx.total_severe_cases_kyoto,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
#plt.yscale('log')
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計重症者 (大阪/兵庫/京都)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
# %%
-
累計死亡者の積み重ね折れ線グラフを作成して都道府県別に比較する(東京/大阪/愛知)
-
累計死亡者の積み重ね折れ線グラフを作成して都道府県別に比較する(神奈川/埼玉/千葉)
-
累計死亡者の積み重ね折れ線グラフを作成して都道府県別に比較する(大阪/兵庫/京都)
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# Article019_Matplotlib Stack Plots Part2 COVID-19(3).py
# %%
# Import the necessary libraries
from os import terminal_size
import pandas as pd
from pandas.core.frame import DataFrame
import pandas_datareader.data as web # pip install pandas_datareader
import matplotlib.pyplot as plt
import matplotlib.dates as mpl_dates
import matplotlib.style as style
from datetime import datetime, timedelta
import numpy as np
import warnings
warnings.simplefilter('ignore')
# %%
# 0) Load the csv files
csv_file = 'data/csv/covid-19/japan/combined_v2.csv'
#csv_file = 'https://money-or-ikigai.com/menu/python/article/data/covid-19/combined_v2.csv'
raw = pd.read_csv(csv_file, parse_dates=['date'])
#raw.info()
#raw.head()
# %%
# 1) Create a CSV file 'data/csv/covid-19/japan/combined2.csv'
df = raw
prefs = ['Tokyo','Osaka', 'Kyoto','Hyogo','Aichi', 'Saitama','Kanagawa','Chiba']
for pref in prefs:
# Filter prefecture
filter_by = filter_by = (df['prefecture'] == pref)
dfx = df[filter_by]
pref = pref.lower()
dfx.rename(columns={
'total_cases': f'total_cases_{pref}',
'total_deaths': f'total_deaths_{pref}',
'total_severe_cases': f'total_severe_cases_{pref}'
}, inplace=True)
dfx = dfx[['date', f'total_cases_{pref}', f'total_deaths_{pref}', f'total_severe_cases_{pref}']]
dfx.set_index('date')
if pref == 'tokyo':
dfall = dfx
else:
dfall = pd.merge(dfall, dfx)
csv_file = 'data/csv/covid-19/japan/combined3.csv'
dfall.to_csv(csv_file, index=False)
# %%
# 2) Draw a simple stack chart : new cases (tokyo, osaka, aichi)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
tokyo_total_deaths = dfx.total_deaths_tokyo.values[0].round(0)
osaka_total_deaths = dfx.total_deaths_osaka.values[0].round(0)
aichi_total_deaths = dfx.total_deaths_aichi.values[0].round(0)
#labels = ['Tokyo','Osaka','Aichi']
labels = [
f'東京({tokyo_total_deaths:,.0f})',
f'大阪({osaka_total_deaths:,.0f})',
f'愛知({aichi_total_deaths:,.0f})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_deaths_tokyo, dfx.total_deaths_osaka, dfx.total_deaths_aichi,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
#plt.yscale('log')
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計死亡者 (東京/大阪/愛知)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
# %%
# 3) Draw a simple stack chart : new cases (kanagawa, saitama, chiba)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
kanagawa_total_deaths = dfx.total_deaths_kanagawa.values[0].round(0)
saitama_total_deaths = dfx.total_deaths_saitama.values[0].round(0)
chiba_total_deaths = dfx.total_deaths_chiba.values[0].round(0)
#labels = ['Kanagawa','Saitama','Chiba']
labels = [
f'神奈川({kanagawa_total_deaths:,.0f})',
f'埼玉({saitama_total_deaths:,.0f})',
f'千葉({chiba_total_deaths:,.0f})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_deaths_kanagawa, dfx.total_deaths_saitama, dfx.total_deaths_chiba,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
#plt.yscale('log')
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計死亡者 (神奈川/埼玉/千葉)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
# %%
# 4) Draw a simple stack chart : new cases (Osaka, Hyogo, Kyoto)
plt.rcParams['font.family'] = 'Meiryo' # Meiryo, Yu Gothic
plt.style.use('fivethirtyeight') # 'fivethirtyeight' 'ggplot'
plt.figure(figsize=(12,5))
blue = '#008fd5'
red = '#fc4f30'
yellow = '#e5ae37'
green = '#6d904f'
colors = [red, blue, green]
df = dfall
last_date = df['date'].max()
filter_by = (df['date'] == last_date)
dfx = df[filter_by]
osaka_total_deaths = dfx.total_deaths_osaka.values[0].round(0)
hyogo_total_deaths = dfx.total_deaths_hyogo.values[0].round(0)
kyoto_total_deaths = dfx.total_deaths_kyoto.values[0].round(0)
#labels = ['Osaka','Hyogo','Kyoto']
labels = [
f'大阪({osaka_total_deaths:,.0f})',
f'兵庫({hyogo_total_deaths:,.0f})',
f'京都({kyoto_total_deaths:,.0f})'
]
filter_by = (df['date'] >= '2020-07-01')
dfx = df[filter_by]
plt.stackplot(dfx.date, dfx.total_deaths_osaka, dfx.total_deaths_hyogo, dfx.total_deaths_kyoto,
labels=labels, colors=colors)
plt.gcf().autofmt_xdate()
date_format = mpl_dates.DateFormatter('%Y/%m/%d')
#date_format = mpl_dates.DateFormatter('%m/%d')
plt.gca().xaxis.set_major_formatter(date_format)
plt.margins(x=0)
#plt.yscale('log')
plt.xticks(rotation=45)
plt.ylabel('人数')
plt.title('COVID-19 累計死亡者 (大阪/兵庫/京都)\n(2020-2021)')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
# %%