Python {Article019}

ようこそ「Python」へ...

生データを使用してMatplotlibで積み上げ折れ線グラフ(stackplot)を作成する方法を学ぶには【Pandas+Matplotlib】

ここでは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]をクリックします。 画像の任意の場所をクリックして閉じることもできます。

click image to zoom!
ゲーム得点
click image to zoom!
プロジェクト管理
click image to zoom!
累計感染者
click image to zoom!
累計重症者
click image to zoom!
累計死亡者

まずはMatplotlibのstackplot()で積み重ね折れ線グラフを作成してみる

  1. ゲームの得点をプレイヤー別に積み重ね折れ線グラフで表示する

    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()
    
    # %%
    click image to zoom!
    図1
    図1は実行結果です。3人のプレイヤーの得点が表示されています。
  2. 積み重ね折れ線グラフにオプション(スタイル、タイトル、ラベル、凡例など)を追加する

    行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()
    click image to zoom!
    図2
    図2は実行結果です。グラフにX軸、Y軸のラベル、凡例、タイトルが表示されています。
  3. 積み重ね折れ線グラフのデフォルの色を変える

    行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()
    click image to zoom!
    図3
    図3は実行結果です。プレイヤー1-3の色が変更されました。
  4. プロジェクト管理で開発者別の作業時間を積み重ね折れ線グラフで表示する

    行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()
    click image to zoom!
    図4
    図4は実行結果です。開発者別の作業時間がグラフ化されて表示されています。 また、凡例がグラフ内に表示されています。
  5. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # 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()
    
    # %%
    

日課の内訳を積み重ね折れ線グラフで作成してみる

  1. 5日間の日課の内訳を積み重ね折れ線グラフで表示する

    行4-7ではPythonのライブラリを取り込んでいます。 行9では日本語が使えるようにCSSの「font.family」プロパティに日本語のフォント「Meiryo」を設定しています。 行10ではグラフのスタイル「fivethirtyeight」を設定しています。 行11ではMatplotlibのfigure()メソッドでグラフのサイズを設定しています。 行13ではX軸の値(日付)を定義しています。 行15-18ではY軸の値(1日の内訳:時間)を定義しています。 行25-26ではグラフのラベルと色を定義しています。 行28-29ではMatplotlibのstackplot()メソッドで積み重ね折れ線グラフを作成しています。 行31ではX軸のマージンを「0」に設定しています。 行32ではX軸のラベル(日付)が45度で表示されるように設定しています。 行33-35ではグラフのラベル、タイトルを設定しています。 行36ではMatplotlibのlegend()メソッドで凡例の位置と形式を設定しています。 引数「bbox_to_anchor=(1, 1.18)」では凡例の位置を指定しています。 ここでは右上に表示されるように調整しています。 引数「ncol = 2」では凡例が2行で表示されるように指定しています。
    # Article019_Matplotlib Stack Plots Part1.py
    # %%
    # 1) Load Necesary libraries
    import matplotlib.pyplot as plt
    import matplotlib.dates as mpl_dates
    import matplotlib.style as style
    import numpy as np
    
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    days = ['9/1','9/2','9/3','9/4','9/5']
    
    sleeping = [7,8,6,11,7]
    eating = [2,3,4,3,2]
    working = [7,8,7,2,2]
    playing = [8,5,7,8,13]
    
    blue = '#008fd5'
    red = '#fc4f30'
    yellow = '#e5ae37'
    green = '#6d904f'
    
    labels = ['Sleeping','Eating','Working','Playing']
    colors = [blue, red, yellow, green]
    
    plt.stackplot(days, sleeping, eating, working, playing,
        labels=labels, colors=colors)
    
    plt.margins(x=0)
    plt.xticks(rotation=45)
    plt.xlabel('日付')
    plt.ylabel('時間')
    plt.title('私の日課')
    plt.legend(bbox_to_anchor=(1, 1.18), ncol = 2)
    plt.show()
    click image to zoom!
    図5
    図5は実行結果です。凡例が右上に2行で表示されています。

COVID-19の感染者累計を積み重ね折れ線グラフで作成して都道府県別に比較してみる

  1. 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'])
    click image to zoom!
    図6

  2. 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)
    click image to zoom!
    図7-1

    click image to zoom!
    図7-2

  3. 累計感染者の積み重ね折れ線グラフを作成して都道府県別に比較する(東京/大阪/愛知)

    # 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()
    click image to zoom!
    図8 東京/大阪/愛知

  4. 累計感染者の積み重ね折れ線グラフを作成して都道府県別に比較する(神奈川/埼玉/千葉)

    # 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()
    click image to zoom!
    図9 神奈川/埼玉/千葉

  5. 累計感染者の積み重ね折れ線グラフを作成して都道府県別に比較する(大阪/兵庫/京都)

    # 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()
    click image to zoom!
    図10 大阪/兵庫/京都

  6. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # 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()
    
    # %%
    

COVID-19の重症者累計を積み重ね折れ線グラフで作成して都道府県別に比較してみる

  1. 累計重症者の積み重ね折れ線グラフを作成して都道府県別に比較する(東京/大阪/愛知)

    click image to zoom!
    図11 東京/大阪/愛知

  2. 累計重症者の積み重ね折れ線グラフを作成して都道府県別に比較する(神奈川/埼玉/千葉)

    click image to zoom!
    図12 神奈川/埼玉/千葉

  3. 累計重症者の積み重ね折れ線グラフを作成して都道府県別に比較する(大阪/兵庫/京都)

    click image to zoom!
    図13 大阪/兵庫/京都

  4. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # 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()
    
    # %%
    

COVID-19の死亡者累計を積み重ね折れ線グラフで作成して都道府県別に比較してみる

  1. 累計死亡者の積み重ね折れ線グラフを作成して都道府県別に比較する(東京/大阪/愛知)

    click image to zoom!
    図14 東京/大阪/愛知

  2. 累計死亡者の積み重ね折れ線グラフを作成して都道府県別に比較する(神奈川/埼玉/千葉)

    click image to zoom!
    図15 神奈川/埼玉/千葉

  3. 累計死亡者の積み重ね折れ線グラフを作成して都道府県別に比較する(大阪/兵庫/京都)

    click image to zoom!
    図16 大阪/兵庫/京都

  4. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # 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()
    
    # %%