Python {Article015}

ようこそ「Python」へ...

生データを使用してMatplotlibでグラフ(棒グラフ)を作成する方法を学ぶには【Pandas+Matplotlib】

ここではWebサイトで公開されて生データを使用してPandas+Matplotlibで棒グラフを作成する方法を解説します。 最初に厚労省のWebサイトからCOVID-19のデータをダウンロードしてMatplotlibで棒グラフを作成する方法を説明します。 次に、Yahoo! FinanceからGAFAの株価をダウンロードして棒グラフを作成する方法も説明します。 最後に、Yahoo! Financeから仮想通貨(暗号通貨)のビットコイン、イーサリアム等の価格をダウンロードして棒グラフを作成する方法も説明します。

厚労省の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!
日別感染者(上位20県)
click image to zoom!
累計発症者(上位20県)
click image to zoom!
累計重症者(上位20県)
click image to zoom!
累計死亡者(上位20県)
click image to zoom!
累計死亡者(下位20県)
click image to zoom!
GAFAM株価
click image to zoom!
仮想通貨(暗号通貨)価格

まずは簡単な棒グラフを作成してみる

  1. Pythonのプラグラム内で用意したデータを使って簡単な棒グラフを作成する

    Visual Studio Codeを起動したら以下のコードを入力して実行[Ctrl+Enter]します。 行4-10ではPythonのライブラリを取り込んでいます。 行11では警告メッセージが表示されないように抑止しています。 行16ではmatplotlibで日本語が使えるように日本語のフォント「Meiryo」を設定しています。 行18-19では棒グラフのX軸、Y軸の値を定義しています。 行21ではmatplotlibのbar()メソッドで垂直棒グラフを作成しています。 行25のコメント「# %%」を入力してインタラクティブ環境に切り換えることを忘れないでください。
    # Matplotlib Bar Chart Part1
    # %%
    # Import the necessary libraries  
    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.style as style
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # Draw a single bar chart (Tokyo)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    
    date_x = ['2021/1','2021/2','2021/3','2021/4','2021/5','2021/6','2021/7','2021/8','2021/9']
    tokyo_y = [100,120,130,250,300,250,180,350,300]
    
    plt.bar(date_x, tokyo_y)
    
    #plt.show()
    
    # %%
    click image to zoom!
    図1
    図1は実行結果です。matplotlibはX軸、Y軸の値を指定するだけで簡単に垂直棒グラフが作成できます。
  2. 棒グラフにオプションを追加する

    行6ではmatplotlibのfigure()メソッドで図のサイズを設定しています。 行11ではX軸のラベルを設定しています。 行12ではY軸のラベルを設定しています。 行13ではグラフのタイトルを設定しています。 行14では凡例「東京」が中央の左端に表示されるように設定しています。
    # Add options (figsize, xticks, label, ylabel, title, legend)
    
    date_x = ['2021/1','2021/2','2021/3','2021/4','2021/5','2021/6','2021/7','2021/8','2021/9']
    tokyo_y = [100,120,130,250,300,250,180,350,300]
    
    plt.figure(figsize=(12,5))
    
    plt.bar(date_x, tokyo_y, label='東京')
    
    #plt.xticks(rotation=45)
    plt.xlabel('(日付)')
    plt.ylabel('感染者数')
    plt.title('COVID-19 新規感染者')
    plt.legend(loc='upper left')
    #plt.show()
    click image to zoom!
    図2

  3. 棒グラフに大阪と埼玉を追加する▶棒が重ねて作成される

    行6-7では大阪と埼玉のY軸の値を追加しています。 行12-13では大阪と埼玉の棒グラフを作成しています。 行19ではmatplotlibのgrid()メソッドでグラフにグリッドを追加しています。 行20ではmatplotlibのtight_layout()メソッドでNOTE-PCなどを使用した場合にもグラフが綺麗に表示されるようにしています。
    # Add two bars part1 (osaka, saitama)
    
    date_x = ['2021/1','2021/2','2021/3','2021/4','2021/5','2021/6','2021/7','2021/8','2021/9']
    
    tokyo_y = [100,120,130,250,300,250,180,350,300]
    osaka_y = [80,100,110,230,290,220,150,300,280]
    saitama_y = [70,100,200,250,260,200,150,330,280]
    
    plt.figure(figsize=(12,5))
    
    plt.bar(date_x, tokyo_y, label='東京')
    plt.bar(date_x, osaka_y, label='大阪')
    plt.bar(date_x, saitama_y, label='埼玉')
    
    plt.xlabel('(日付)')
    plt.ylabel('感染者数')
    plt.title('COVID-19 新規感染者')
    plt.legend(loc='upper left')
    plt.grid(True)
    plt.tight_layout()
    #plt.show()
    click image to zoom!
    図3
    図3は実行結果です。東京、大阪、埼玉の棒が重なって表示されます。 次のステップではこれらの棒が重ならないようにします。
  4. 棒グラフが重ならないようにする

    行4ではX軸の要素の個数を計算しています。 X軸は1月から9月まで9個の要素があるので個数は9になります。 行5では棒の幅を設定しています。 行13-15では東京、大阪、埼玉の棒グラフを作成しています。 matplotlibのbar()メソッドの引数1に「x_indexes - width, x_indexes, x_indexes + width」を指定しています。 これは大阪の棒を基点に東京と埼玉の棒を左右に棒の幅だけずらすための指定です。 行17ではmatplotlibのxticks()メソッドでX軸のラベルを設定しています。
    # Add two bars part2 fixed version (osaka, saitama)
    
    date_x = ['2021/1','2021/2','2021/3','2021/4','2021/5','2021/6','2021/7','2021/8','2021/9']
    x_indexes = np.arange(len(date_x))
    width = 0.25
    
    tokyo_y = [100,120,130,250,300,250,180,350,300]
    osaka_y = [80,100,110,230,290,220,150,300,280]
    saitama_y = [70,100,200,250,260,200,150,330,280]
    
    plt.figure(figsize=(12,5))
    
    plt.bar(x_indexes - width, tokyo_y, width=width, label='東京')
    plt.bar(x_indexes, osaka_y, width=width, label='大阪')
    plt.bar(x_indexes + width, saitama_y, width=width, label='埼玉')
    
    plt.xticks(ticks=x_indexes, labels=date_x, rotation=45)
    plt.ylabel('感染者数')
    plt.title('COVID-19 新規感染者')
    plt.legend(loc='upper left')
    plt.grid(True)
    plt.tight_layout()
    #plt.show()
    click image to zoom!
    図4
    図4は実行結果です。図3のように棒が重ならないで表示されています。
  5. 棒グラフにスタイルを追加する

    行6ではmatplotlibのstyle.use()メソッドでグラフのスタイルを設定しています。 ここでは「fivethirtyeight」を設定しています。 TIP1を参考にスタイルを変更してみてください。
    # Add options (style)
    
    #plt.xkcd()
    #plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    
    plt.style.use('fivethirtyeight')    # plt.style.available  
    
    date_x = ['2021/1','2021/2','2021/3','2021/4','2021/5','2021/6','2021/7','2021/8','2021/9']
    x_indexes = np.arange(len(date_x))
    width = 0.25
    
    tokyo_y = [100,120,130,250,300,250,180,350,300]
    osaka_y = [80,100,110,230,290,220,150,300,280]
    saitama_y = [70,100,200,250,260,200,150,330,280]
    
    plt.figure(figsize=(12,5))
    
    plt.bar(x_indexes - width, tokyo_y, width=width, label='東京')
    plt.bar(x_indexes, osaka_y, width=width, label='大阪')
    plt.bar(x_indexes + width, saitama_y, width=width, label='埼玉')
    
    plt.xticks(ticks=x_indexes, labels=date_x, rotation=45)
    plt.ylabel('感染者数')
    plt.title('COVID-19 新規感染者')
    plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.savefig('plot.png')
    #plt.show()
    click image to zoom!
    図5
    図5は実行結果です。棒グラフに「fivethirtyeight」のスタイルが適用されています。
    click image to zoom!
    図TIP1
    TIP1:スタイルの一覧を表示するには?
    インタラクティブ・ウィンドウに「plt.style.available」を入力して[shift+enter]で実行するとスタイルの一覧が表示されます。 スタイルのおすすめは「fivethirtyeight, ggplot」などです。 スタイルを書き換えて色々試してみてください。
    click image to zoom!
    図TIP2
    TIP2:棒グラフを手書き風に見せるには?
    棒グラフを手書き風に見せるには「plt.xkcd()」を追加します。 ただし、フォントがリセットさせるので「plt.rcParams['font.family'] = 'Meiryo'」のようにフォント名を追加して再度設定する必要があります。 このとき「手書き風」のフォント名を指定します。
  6. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # Matplotlib Bar Chart Part1
    # %%
    # Import the necessary libraries  
    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.style as style
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # Draw a single bar chart (Tokyo)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    
    date_x = ['2021/1','2021/2','2021/3','2021/4','2021/5','2021/6','2021/7','2021/8','2021/9']
    tokyo_y = [100,120,130,250,300,250,180,350,300]
    
    plt.bar(date_x, tokyo_y)
    
    #plt.show()
    
    # %%
    
    # Add options (figsize, xticks, label, ylabel, title, legend)
    
    date_x = ['2021/1','2021/2','2021/3','2021/4','2021/5','2021/6','2021/7','2021/8','2021/9']
    tokyo_y = [100,120,130,250,300,250,180,350,300]
    
    plt.figure(figsize=(12,5))
    plt.bar(date_x, tokyo_y, label='東京')
    #plt.xticks(rotation=45)
    plt.xlabel('(日付)')
    plt.ylabel('感染者数')
    plt.title('COVID-19 新規感染者')
    plt.legend(loc='upper left')
    #plt.show()
    
    # %%
    
    # Add two bars part1 (osaka, saitama)
    
    date_x = ['2021/1','2021/2','2021/3','2021/4','2021/5','2021/6','2021/7','2021/8','2021/9']
    
    tokyo_y = [100,120,130,250,300,250,180,350,300]
    osaka_y = [80,100,110,230,290,220,150,300,280]
    saitama_y = [70,100,200,250,260,200,150,330,280]
    
    plt.figure(figsize=(12,5))
    
    plt.bar(date_x, tokyo_y, label='東京')
    plt.bar(date_x, osaka_y, label='大阪')
    plt.bar(date_x, saitama_y, label='埼玉')
    
    #plt.xticks(rotation=45)
    plt.xlabel('(日付)')
    plt.ylabel('感染者数')
    plt.title('COVID-19 新規感染者')
    plt.legend(loc='upper left')
    plt.grid(True)
    plt.tight_layout()
    #plt.show()
    
    # %%
    
    # Add two bars part2 fixed version (osaka, saitama)
    
    date_x = ['2021/1','2021/2','2021/3','2021/4','2021/5','2021/6','2021/7','2021/8','2021/9']
    x_indexes = np.arange(len(date_x))
    width = 0.25
    
    tokyo_y = [100,120,130,250,300,250,180,350,300]
    osaka_y = [80,100,110,230,290,220,150,300,280]
    saitama_y = [70,100,200,250,260,200,150,330,280]
    
    plt.figure(figsize=(12,5))
    
    plt.bar(x_indexes - width, tokyo_y, width=width, label='東京')
    
    plt.bar(x_indexes, osaka_y, width=width, label='大阪')
    
    plt.bar(x_indexes + width, saitama_y, width=width, label='埼玉')
    
    plt.xticks(ticks=x_indexes, labels=date_x, rotation=45)
    #plt.xlabel('(日付)')
    plt.ylabel('感染者数')
    plt.title('COVID-19 新規感染者')
    plt.legend(loc='upper left')
    plt.grid(True)
    plt.tight_layout()
    #plt.show()
    
    # %%
    
    # Add options (style)
    plt.xkcd()
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic 
    #plt.rcParams['font.family'] = ['Yu Gothic', 'Meirio']
    
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    
    date_x = ['2021/1','2021/2','2021/3','2021/4','2021/5','2021/6','2021/7','2021/8','2021/9']
    x_indexes = np.arange(len(date_x))
    width = 0.25
    
    tokyo_y = [100,120,130,250,300,250,180,350,300]
    osaka_y = [80,100,110,230,290,220,150,300,280]
    saitama_y = [70,100,200,250,260,200,150,330,280]
    
    plt.figure(figsize=(12,5))
    
    plt.bar(x_indexes - width, tokyo_y, width=width, label='東京')
    plt.bar(x_indexes, osaka_y, width=width, label='大阪')
    plt.bar(x_indexes + width, saitama_y, width=width, label='埼玉')
    
    plt.xticks(ticks=x_indexes, labels=date_x, rotation=45)
    #plt.xlabel('(日付)')
    plt.ylabel('感染者数')
    plt.title('COVID-19 新規感染者')
    plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.savefig('plot.png')
    #plt.show()
    
    # %%
    

COVIC-19(新型コロナ)の生データを使って棒グラフを作成する

  1. COVID-19のCSVファイルを取り込む

    ここで使用するCSVファイル「combined.csv」は、 「記事(Article013)」で作成しています。 「記事(Article013)」を参考に事前にCSVファイルを作成しておいてください。 ちなみに、COVID-19のデータは厚労省のWebサイトからURLを指定してダウンロードするので完全に自動化できます。

    NOTE: COVID-19のCSVデータを当サイトから直接ダウンロードするには?
    COVID-19のCSVファイル「combined.csv」を当サイトから直接ダウンロードするには行14をコメントにして行15のコメントを外してください。 これで記事(Article013)で作成したCSVファイルを当サイトからダウンロードすることができます。 このCSVファイルは2021/9/19に作成したものになります。最新のデータを使うには 「 記事(Article013)」を参考に作成してください。

    行4-10ではPythonのライブラリを取り込んでいます。 行11ではPythonの警告メッセージを抑止しています。 行14ではCOVID-19のCSVファイルのパスを定義しています。 CSVファイルのパスはご自分の環境にあわせて書き換えてください。 当サイトから取り込むときは行14をコメントにして行15のコメントを外してください。 行16ではPandasのread_csv()メソッドでCOVID-19のデータを取り込んでDataFrameに格納しています。 行19ではPandasのto_datetime()メソッドで DataFrameの列「date」をstr型からdatetime64型に変更しています。
    # Matplotlib Bar Chart Part2 COVID-19  
    # %%
    # Import the necessary libraries  
    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.style as style
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # Load the csv files 
    csv_file = 'data/csv/covid-19/japan/combined.csv'
    #csv_file = 'https://money-or-ikigai.com/menu/python/article/data/covid-19/combined.csv'
    raw = pd.read_csv(csv_file) 
    
    # Convert str to datetime
    raw['date'] = pd.to_datetime(raw['date'])
    click image to zoom!
    図6

  2. 日別感染者の垂直棒グラフを作成する▶棒が重ねて表示される

    # Plot a vartical bar chart for new_cases (日別感染者 垂直棒グラフ)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Filter dataframe to new_cases
    filter_by = (raw['file_id'] == 'new_cases')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most cases currently
    desc_prefs = df.groupby('prefecture')['new_cases'].sum().sort_values(ascending=False)	
    prefs =  desc_prefs.index[0:3]  # Select 3 prefectures
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref)
        #filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-03-01') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')['new_cases'].sum()
        plt.bar(grp.index, grp.values, label=pref)     
    
    plt.xticks(rotation=45)
    plt.ylabel('感染者数')
    plt.title('COVID-19 日別感染者\n(2020/1 - 2021/9)')
    plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.show()
    click image to zoom!
    図7

  3. 日別感染者の垂直棒グラフを作成する(上位3県)

    # Plot a vartical bar chart for new_cases (日別感染者 垂直棒グラフ: 上位3県)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Filter dataframe to new_cases
    filter_by = (raw['file_id'] == 'new_cases')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most cases currently
    desc_prefs = df.groupby('prefecture')['new_cases'].sum().sort_values(ascending=False)	
    prefs =  desc_prefs.index[0:3]  # Select 3 prefectures
    position = 3    # 3:left, 2:cener , 1:right
    width = 0.25
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-09-01') & (df['date'] <= '2021-09-07') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')['new_cases'].sum()
        x_indexes = np.arange(len(grp.index))   
        if position == 3:   # left bar?
            plt.bar(x_indexes - width, grp.values, width=width, label=pref)    
        elif position == 2: # center bar?
            plt.bar(x_indexes, grp.values, width=width, label=pref)   
        else:               # right bar
            plt.bar(x_indexes + width, grp.values, width=width, label=pref) 
        position -= 1        
    
    plt.xticks(ticks=x_indexes, labels=x_indexes+1)
    plt.xlabel('(2021/9/1~2021/9/7)')
    plt.ylabel('感染者数')
    plt.title('COVID-19 日別感染者\n(2020/9/1 - 2021/9/7)')
    plt.legend(loc='upper right')
    plt.tight_layout()
    #plt.show()
    click image to zoom!
    図8

  4. 累計発症者の水平棒グラフを作成する(上位20県)

    # Plot a horizontal bar chart for total_cases (累計発症者 水平棒グラフ: 上位20県)
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(11,8))
    
    # Filter dateframe to new_cases
    filter_by = (raw['file_id'] == 'new_cases')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most cases currently
    last_date = df['date'].max()
    filter_by = (df['date'] == last_date)
    dfx = df[filter_by]
    
    dfx.sort_values(by='total_cases', ascending=False, inplace=True)
    dfx.reset_index(inplace=True)
    dfx.drop(dfx[dfx.index > 20].index, inplace=True)
    dfx.sort_values(by='total_cases', ascending=True, inplace=True)
    
    total = dfx['total_cases'].sum()
    
    for index, row in dfx.iterrows():
        #print(index, row.prefecture, row.total_cases)
        plt.barh(row.prefecture, row.total_cases)
        #plt.text(row.total_cases, (dfx.shape[0]-1) - index, str(int(row.total_cases)) , fontsize=10)
        #plt.text(row.total_cases, (dfx.shape[0]-1) - index, str('{:.1%}'.format(row.total_cases / total)) , fontsize=10)
        plt.text(row.total_cases, (dfx.shape[0]-1) - index, str(int(row.total_cases)) + str(' ({:.1%})'.format(row.total_cases / total)) , fontsize=10)
      
    #plt.xticks(rotation=45)
    plt.ylabel('都道府県')
    plt.xlabel('累計発症者数')
    plt.title('COVID-19 累計発症者\n(上位20県)')
    #plt.legend()
    #plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.show()
    click image to zoom!
    図9

  5. 累計死亡者の水平棒グラフを作成する(上位20県)

    # Plot a horizontal bar chart for total_deaths (累計死亡者 水平棒グラフ: 上位20県)
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(11,8))
    
    # Filter dateframe to tot_deaths
    filter_by = (raw['file_id'] == 'tot_deaths')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most deaths currently
    last_date = df['date'].max()
    filter_by = (df['date'] == last_date)
    dfx = df[filter_by]
    
    dfx.sort_values(by='total_deaths', ascending=False, inplace=True)
    dfx.reset_index(inplace=True)
    dfx.drop(dfx[dfx.index > 20].index, inplace=True)
    dfx.sort_values(by='total_deaths', ascending=True, inplace=True)
    
    total = dfx['total_deaths'].sum()
    
    for index, row in dfx.iterrows():
        #print(index, row.prefecture, row.total_deaths)
        plt.barh(row.prefecture, row.total_deaths)
        #plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str(int(row.total_deaths)) , fontsize=10)
        #plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str("{:.1%}".format(row.total_deaths / total)) , fontsize=10)
        plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str(int(row.total_deaths)) + str(' ({:.1%})'.format(row.total_deaths / total)) , fontsize=10)
    
    #plt.xticks(rotation=45)
    plt.ylabel('都道府県')
    plt.xlabel('累計死亡者数')
    plt.title('COVID-19 累計死亡者\n(上位20県)')
    #plt.legend()
    #plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.show()
    click image to zoom!
    図10

  6. 累計死亡者の水平棒グラフを作成する(下位20県)

    # Plot a horizontal bar chart for total_deaths (累計死亡者 水平棒グラフ: 下位20県)
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(11,8))
    
    # Filter dateframe to tot_deaths
    filter_by = (raw['file_id'] == 'tot_deaths')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most deaths currently
    last_date = df['date'].max()
    filter_by = (df['date'] == last_date)
    dfx = df[filter_by]
    
    dfx.sort_values(by='total_deaths', ascending=True, inplace=True)
    dfx.reset_index(inplace=True)
    dfx.drop(dfx[dfx.index > 20].index, inplace=True)
    dfx.sort_values(by='total_deaths', ascending=False, inplace=True)
    
    total = dfx['total_deaths'].sum()
    
    for index, row in dfx.iterrows():
        #print(index, row.prefecture, row.total_deaths)
        plt.barh(row.prefecture, row.total_deaths)
        #plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str(int(row.total_deaths)) , fontsize=10)
        #plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str("{:.1%}".format(row.total_deaths / total)) , fontsize=10)
        plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str(int(row.total_deaths)) + str(' ({:.1%})'.format(row.total_deaths / total)) , fontsize=10)
    
    #plt.xticks(rotation=45)
    plt.ylabel('都道府県')
    plt.xlabel('累計死亡者数')
    plt.title('COVID-19 累計死亡者\n(下位20県)')
    #plt.legend()
    #plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.show()
    click image to zoom!
    図11

  7. 累計重症者の水平棒グラフを作成する(上位20県)

    # Plot a horizontal bar chart for total_severe_cases (累計重症者 水平棒グラフ: 上位20県)
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(11,8))
    
    # Filter dateframe to new_severe_cases
    filter_by = (raw['file_id'] == 'new_severe_cases')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most server cases currently
    last_date = df['date'].max()
    filter_by = (df['date'] == last_date)
    dfx = df[filter_by]
    
    dfx.sort_values(by='total_severe_cases', ascending=False, inplace=True)
    dfx.reset_index(inplace=True)
    dfx.drop(dfx[dfx.index > 20].index, inplace=True)
    dfx.sort_values(by='total_severe_cases', ascending=True, inplace=True)
    
    total = dfx['total_severe_cases'].sum()
    
    for index, row in dfx.iterrows():
        #print(index, row.prefecture, row.total_severe_cases)
        plt.barh(row.prefecture, row.total_severe_cases)
        #plt.text(row.total_severe_cases, (dfx.shape[0]-1) - index, str(int(row.total_severe_cases)) , fontsize=10)
        #plt.text(row.total_severe_cases, (dfx.shape[0]-1) - index, str("{:.1%}".format(row.total_severe_cases / total)) , fontsize=10)
        plt.text(row.total_severe_cases, (dfx.shape[0]-1) - index, str(int(row.total_severe_cases)) + str(' ({:.1%})'.format(row.total_severe_cases / total)) , fontsize=10)
        
    #plt.xticks(rotation=45)
    plt.ylabel('都道府県')
    plt.xlabel('累計重症者数')
    plt.title('COVID-19 累計重症者\n(上位20県)')
    #plt.legend()
    #plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.show()
    click image to zoom!
    図12

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

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # Matplotlib Bar Chart Part2 COVID-19  
    # %%
    # Import the necessary libraries  
    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.style as style
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # Load the csv files 
    
    csv_file = 'data/csv/covid-19/japan/combined.csv'
    #csv_file = 'https://money-or-ikigai.com/menu/python/article/data/covid-19/combined.csv'
    raw = pd.read_csv(csv_file) 
    
    # Convert str to datetime
    raw['date'] = pd.to_datetime(raw['date'])
    
    # %%
    
    # Plot a vartical bar chart for new_cases (日別感染者 垂直棒グラフ)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Filter dataframe to new_cases
    filter_by = (raw['file_id'] == 'new_cases')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most cases currently
    desc_prefs = df.groupby('prefecture')['new_cases'].sum().sort_values(ascending=False)	
    prefs =  desc_prefs.index[0:3]  # Select 3 prefectures
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref)
        #filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-03-01') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')['new_cases'].sum()
        plt.bar(grp.index, grp.values, label=pref)     
    
    plt.xticks(rotation=45)
    plt.ylabel('感染者数')
    plt.title('COVID-19 日別感染者\n(2020/1 - 2021/9)')
    plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.show()
    
    # %%
    
    # Plot a vartical bar chart for new_cases (日別感染者 垂直棒グラフ: 上位3県)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Filter dataframe to new_cases
    filter_by = (raw['file_id'] == 'new_cases')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most cases currently
    desc_prefs = df.groupby('prefecture')['new_cases'].sum().sort_values(ascending=False)	
    prefs =  desc_prefs.index[0:3]  # Select 3 prefectures
    position = 3    # 3:left, 2:cener , 1:right
    width = 0.25
    
    for pref in prefs:
        filter_by = (df['prefecture'] == pref) & (df['date'] >= '2021-09-01') & (df['date'] <= '2021-09-07') 
        dfx = df[filter_by]     
        grp = dfx.groupby('date')['new_cases'].sum()
        x_indexes = np.arange(len(grp.index))   
        if position == 3:   # left bar?
            plt.bar(x_indexes - width, grp.values, width=width, label=pref)    
        elif position == 2: # center bar?
            plt.bar(x_indexes, grp.values, width=width, label=pref)   
        else:               # right bar
            plt.bar(x_indexes + width, grp.values, width=width, label=pref) 
        position -= 1        
    
    plt.xticks(ticks=x_indexes, labels=x_indexes+1, rotation=45)
    #plt.xticks(rotation=45)
    plt.ylabel('感染者数')
    plt.title('COVID-19 日別感染者\n(2020/9/1 - 2021/9/7)')
    plt.legend(loc='upper right')
    plt.tight_layout()
    #plt.show()
    
    # %%
    
    # Plot a horizontal bar chart for total_cases (累計発症者 水平棒グラフ: 上位20県)
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(11,8))
    
    # Filter dateframe to new_cases
    filter_by = (raw['file_id'] == 'new_cases')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most cases currently
    last_date = df['date'].max()
    filter_by = (df['date'] == last_date)
    dfx = df[filter_by]
    
    dfx.sort_values(by='total_cases', ascending=False, inplace=True)
    dfx.reset_index(inplace=True)
    dfx.drop(dfx[dfx.index > 20].index, inplace=True)
    dfx.sort_values(by='total_cases', ascending=True, inplace=True)
    
    total = dfx['total_cases'].sum()
    
    for index, row in dfx.iterrows():
        #print(index, row.prefecture, row.total_cases)
        plt.barh(row.prefecture, row.total_cases)
        #plt.text(row.total_cases, (dfx.shape[0]-1) - index, str(int(row.total_cases)) , fontsize=10)
        #plt.text(row.total_cases, (dfx.shape[0]-1) - index, str('{:.1%}'.format(row.total_cases / total)) , fontsize=10)
        plt.text(row.total_cases, (dfx.shape[0]-1) - index, str(int(row.total_cases)) + str(' ({:.1%})'.format(row.total_cases / total)) , fontsize=10)
      
    #plt.xticks(rotation=45)
    plt.ylabel('都道府県')
    plt.xlabel('累計発症者数')
    plt.title('COVID-19 累計発症者\n(上位20県)')
    #plt.legend()
    #plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.show()
    
    # %%
    
    # Plot a horizontal bar chart for total_deaths (累計死亡者 水平棒グラフ: 上位20県)
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(11,8))
    
    # Filter dateframe to tot_deaths
    filter_by = (raw['file_id'] == 'tot_deaths')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most deaths currently
    last_date = df['date'].max()
    filter_by = (df['date'] == last_date)
    dfx = df[filter_by]
    
    dfx.sort_values(by='total_deaths', ascending=False, inplace=True)
    dfx.reset_index(inplace=True)
    dfx.drop(dfx[dfx.index > 20].index, inplace=True)
    dfx.sort_values(by='total_deaths', ascending=True, inplace=True)
    
    total = dfx['total_deaths'].sum()
    
    for index, row in dfx.iterrows():
        #print(index, row.prefecture, row.total_deaths)
        plt.barh(row.prefecture, row.total_deaths)
        #plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str(int(row.total_deaths)) , fontsize=10)
        #plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str("{:.1%}".format(row.total_deaths / total)) , fontsize=10)
        plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str(int(row.total_deaths)) + str(' ({:.1%})'.format(row.total_deaths / total)) , fontsize=10)
    
    #plt.xticks(rotation=45)
    plt.ylabel('都道府県')
    plt.xlabel('累計死亡者数')
    plt.title('COVID-19 累計死亡者\n(上位20県)')
    #plt.legend()
    #plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.show()
    
    
    # %%
    
    # Plot a horizontal bar chart for total_deaths (累計死亡者 水平棒グラフ: 下位20県)
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(11,8))
    
    # Filter dateframe to tot_deaths
    filter_by = (raw['file_id'] == 'tot_deaths')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most deaths currently
    last_date = df['date'].max()
    filter_by = (df['date'] == last_date)
    dfx = df[filter_by]
    
    dfx.sort_values(by='total_deaths', ascending=True, inplace=True)
    dfx.reset_index(inplace=True)
    dfx.drop(dfx[dfx.index > 20].index, inplace=True)
    dfx.sort_values(by='total_deaths', ascending=False, inplace=True)
    
    total = dfx['total_deaths'].sum()
    
    for index, row in dfx.iterrows():
        #print(index, row.prefecture, row.total_deaths)
        plt.barh(row.prefecture, row.total_deaths)
        #plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str(int(row.total_deaths)) , fontsize=10)
        #plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str("{:.1%}".format(row.total_deaths / total)) , fontsize=10)
        plt.text(row.total_deaths, (dfx.shape[0]-1) - index, str(int(row.total_deaths)) + str(' ({:.1%})'.format(row.total_deaths / total)) , fontsize=10)
      
    
    #plt.xticks(rotation=45)
    plt.ylabel('都道府県')
    plt.xlabel('累計死亡者数')
    plt.title('COVID-19 累計死亡者\n(下位20県)')
    #plt.legend()
    #plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.show()
          
    # %%
    
    # Plot a horizontal bar chart for total_severe_cases (累計重症者 水平棒グラフ: 上位20県)
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(11,8))
    
    # Filter dateframe to new_severe_cases
    filter_by = (raw['file_id'] == 'new_severe_cases')
    df = raw[filter_by]
    
    # Get to see which prefectures have the most server cases currently
    last_date = df['date'].max()
    filter_by = (df['date'] == last_date)
    dfx = df[filter_by]
    
    dfx.sort_values(by='total_severe_cases', ascending=False, inplace=True)
    dfx.reset_index(inplace=True)
    dfx.drop(dfx[dfx.index > 20].index, inplace=True)
    dfx.sort_values(by='total_severe_cases', ascending=True, inplace=True)
    
    total = dfx['total_severe_cases'].sum()
    
    for index, row in dfx.iterrows():
        #print(index, row.prefecture, row.total_severe_cases)
        plt.barh(row.prefecture, row.total_severe_cases)
        #plt.text(row.total_severe_cases, (dfx.shape[0]-1) - index, str(int(row.total_severe_cases)) , fontsize=10)
        #plt.text(row.total_severe_cases, (dfx.shape[0]-1) - index, str("{:.1%}".format(row.total_severe_cases / total)) , fontsize=10)
        plt.text(row.total_severe_cases, (dfx.shape[0]-1) - index, str(int(row.total_severe_cases)) + str(' ({:.1%})'.format(row.total_severe_cases / total)) , fontsize=10)
        
    #plt.xticks(rotation=45)
    plt.ylabel('都道府県')
    plt.xlabel('累計重症者数')
    plt.title('COVID-19 累計重症者\n(上位20県)')
    #plt.legend()
    #plt.legend(loc='upper left')
    plt.tight_layout()
    #plt.show()
    
    # %%
    

株価(GAFAM)の生データを使って棒グラフを作成する

  1. GAFAMの株価をダウンロードしてCSVファイルに保存する

    # Import the necessary libraries  
    # %%
    import pandas as pd
    from pandas.core.frame import DataFrame
    from pandas.core.indexes.base import Index
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.style as style
    import mplfinance as mpf                # pip install mplfinance
    import datetime as dt
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # 1) Load Data from Yahoo Finace
    start = dt.datetime(2019, 1, 1)
    end = dt.datetime.now()
    df = web.DataReader(['GOOGL','AMZN','FB','AAPL','MSFT'], 'yahoo', start=start, end=end)
    #print(df.info())
    #print(df.head(3))                       #print(df.tail(3))
    csv_file = 'data/csv/article015/stock_before_Stack.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    df = df.stack().reset_index()           # Remove Symbols and reset date index 
    #print(df.info())
    #print(df.head(3))                      #print(df.tail(3))
    csv_file = 'data/csv/article015/stock.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    click image to zoom!
    図13

  2. GAFAM株価の垂直棒グラフを作成する

    # Load stock data from the csv file
    csv_file = 'data/csv/article015/stock.csv'
    df = pd.read_csv(csv_file)
        
    df['Date'] = pd.to_datetime(df['Date']) # Convert str to datetime
    # Date	Symbols	Adj Close	Close	High	Low	Open	Volume
    
    # %%
    
    # Plot a vartical bar chart (last_date, closing price) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index  
    
    for symbol in symbols:    
        filter_by = (grp.index == symbol)     
        grpx = grp[filter_by]     
        plt.bar(grpx.index, grpx.values, label=symbol)     
    
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFAM Stock Prices (株価)\n({last_date.strftime("%Y/%m/%d")})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    click image to zoom!
    図14

  3. GAFAM株価の垂直棒グラフを作成する(上位3)【NG版】

    # Plot a vartical bar chart (top three, ng version) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index[0:3]    # select 3 symbols
    
    date1 = '2021/09/13'
    date2 = '2021/09/17'
    filter_by = (df['Date'] >= date1) & (df['Date'] <= date2)
    dfx = df[filter_by]
    
    for symbol in symbols:    
        filter_by = (df['Symbols'] == symbol) 
        dfy = dfx[filter_by]     
        grp = dfy.groupby('Date')['Close'].sum()
        plt.bar(grp.index, grp.values, label=symbol)     
    
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFAM Stock Prices (株価)\n({date1}~{date2})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    click image to zoom!
    図15

  4. GAFAM株価の垂直棒グラフを作成する(上位3)【改善版】

    # Plot a vartical bar chart (top 3, fixed version) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,6))              # 12,5
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index[0:3]    # select 3 symbols
    position = 3    # 3:left, 2:cener , 1:right
    width = 0.25
    
    date1 = '2021/09/13'
    date2 = '2021/09/17'
    filter_by = (df['Date'] >= date1) & (df['Date'] <= date2)
    dfx = df[filter_by]
    
    for symbol in symbols:    
        filter_by = (df['Symbols'] == symbol) 
        dfy = dfx[filter_by]     
        grp = dfy.groupby('Date')['Close'].sum()
        x_indexes = np.arange(len(grp.index))   
        if position == 3:   # left bar?
            plt.bar(x_indexes - width, grp.values, width=width, label=symbol)    
        elif position == 2: # center bar?
            plt.bar(x_indexes, grp.values, width=width, label=symbol)   
        else:               # right bar
            plt.bar(x_indexes + width, grp.values, width=width, label=symbol) 
        position -= 1  
    
    plt.xticks(ticks=x_indexes, labels=grp.index.strftime('%m/%d'))
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFAM Stock Prices (株価)\n({date1}~{date2})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    click image to zoom!
    図16

  5. GAFAM株価の水平グラフを作成する

    # Plot a horizontal bar chart 
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(9,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    dfx.sort_values(by='Close', ascending=True, inplace=True)
    dfx.reset_index(inplace=True)
    
    for index, row in dfx.iterrows():
        #print(index, row.Symbols, row.Close)
        plt.barh(row.Symbols, row.Close)
        plt.text(row.Close, index , str(int(row.Close)), fontsize=10)
        #plt.text(row.Close+10, index-0.2 , str(int(row.Close)), fontsize=10)
    
    plt.xlabel('Closing Price (USD)')
    plt.title(f'GAFAM Stock Prices (株価)\n({last_date.strftime("%Y/%m/%d")})')
    plt.tight_layout()
    plt.show()
    
    # %%
    click image to zoom!
    図17

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

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    #Article015_Matplotlib Bar Chart Part3 Stock.py
    # %%
    
    # Import the necessary libraries  
    # %%
    import pandas as pd
    from pandas.core.frame import DataFrame
    from pandas.core.indexes.base import Index
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.style as style
    import mplfinance as mpf                # pip install mplfinance
    import datetime as dt
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # Load Data from Yahoo Finace
    start = dt.datetime(2019, 1, 1)
    end = dt.datetime.now()
    df = web.DataReader(['GOOGL','AMZN','FB','AAPL','MSFT'], 'yahoo', start=start, end=end)
    #print(df.info())
    #print(df.head(3))                       #print(df.tail(3))
    csv_file = 'data/csv/article015/stock_before_Stack.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    df = df.stack().reset_index()           # Remove Symbols and reset date index 
    #print(df.info())
    #print(df.head(3))                      #print(df.tail(3))
    csv_file = 'data/csv/article015/stock.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    # %%
    
    # Load stock data from the csv file
    csv_file = 'data/csv/article015/stock.csv'
    df = pd.read_csv(csv_file)
    #print(df.info())       
    df['Date'] = pd.to_datetime(df['Date']) # Convert str to datetime
    #print(df.info())  
    # Date	Symbols	Adj Close	Close	High	Low	Open	Volume
    #print(df.head(5))
    
    # %%
    
    # Plot a vartical bar chart (last_date, closing price) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index  
    #print(grp)
    #print(grp.index)
    #print(grp.values)
    
    for symbol in symbols:    
        filter_by = (grp.index == symbol)     
        grpx = grp[filter_by]     
        plt.bar(grpx.index, grpx.values, label=symbol)     
    
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFAM Stock Prices (株価)\n({last_date.strftime("%Y/%m/%d")})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # Plot a vartical bar chart (top three, ng version) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index[0:3]    # select 3 symbols
    #print(grp)
    #print(grp.index)
    #print(grp.values)
    
    date1 = '2021/09/13'
    date2 = '2021/09/17'
    filter_by = (df['Date'] >= date1) & (df['Date'] <= date2)
    dfx = df[filter_by]
    
    for symbol in symbols:    
        filter_by = (df['Symbols'] == symbol) 
        dfy = dfx[filter_by]     
        grp = dfy.groupby('Date')['Close'].sum()
        plt.bar(grp.index, grp.values, label=symbol)     
    
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFAM Stock Prices (株価)\n({date1}~{date2})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # Plot a vartical bar chart (top 3, fixed version) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,6))              # 12,5
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index[0:3]    # select 3 symbols
    position = 3    # 3:left, 2:cener , 1:right
    width = 0.25
    
    date1 = '2021/09/13'
    date2 = '2021/09/17'
    filter_by = (df['Date'] >= date1) & (df['Date'] <= date2)
    dfx = df[filter_by]
    
    for symbol in symbols:    
        filter_by = (df['Symbols'] == symbol) 
        dfy = dfx[filter_by]     
        grp = dfy.groupby('Date')['Close'].sum()
        x_indexes = np.arange(len(grp.index))   
        if position == 3:   # left bar?
            plt.bar(x_indexes - width, grp.values, width=width, label=symbol)    
        elif position == 2: # center bar?
            plt.bar(x_indexes, grp.values, width=width, label=symbol)   
        else:               # right bar
            plt.bar(x_indexes + width, grp.values, width=width, label=symbol) 
        position -= 1  
    
    plt.xticks(ticks=x_indexes, labels=grp.index.strftime('%m/%d'))
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (USD)')
    plt.title(f'GAFAM Stock Prices (株価)\n({date1}~{date2})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # Plot a horizontal bar chart 
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    #plt.style.use('ggplot')    
    #plt.style.use('seaborn')    
    #plt.style.use('dark_background')  
    #plt.figure(figsize=(7,4))
    plt.figure(figsize=(9,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    dfx.sort_values(by='Close', ascending=True, inplace=True)
    dfx.reset_index(inplace=True)
    
    for index, row in dfx.iterrows():
        #print(index, row.Symbols, row.Close)
        plt.barh(row.Symbols, row.Close)
        plt.text(row.Close, index , str(int(row.Close)), fontsize=10)
        #plt.text(row.Close+10, index-0.2 , str(int(row.Close)), fontsize=10)
    
    #plt.xticks(rotation=45)
    plt.xlabel('Closing Price (USD)')
    plt.title(f'GAFAM Stock Prices (株価)\n({last_date.strftime("%Y/%m/%d")})')
    #plt.legend(loc='lower right')
    plt.tight_layout()
    plt.show()
    
    # %%
    

仮想通貨(暗号通貨)(BTC,ETC,LTC,XRP)の生データを使って棒グラフを作成する

  1. 仮想通貨(暗号通貨)の価格データをダウンロードしてCSVファイルに保存する

    # Import the necessary libraries  
    import pandas as pd
    from pandas.core.frame import DataFrame
    from pandas.core.indexes.base import Index
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.style as style
    import mplfinance as mpf                # pip install mplfinance
    import datetime as dt
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # Load Data from Yahoo Finace
    start = dt.datetime(2019, 1, 1)
    end = dt.datetime.now()
    crypto = ['BTC-JPY', 'ETC-JPY', 'LTC-JPY', 'XRP-JPY', 'SC-JPY']
    df = web.DataReader(crypto, 'yahoo', start=start, end=end)
    csv_file = 'data/csv/article015/crypto_before_Stack.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    df = df.stack().reset_index()           # Remove Symbols and reset date index 
    csv_file = 'data/csv/article015/crypto.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    # %%
    click image to zoom!
    図18

  2. 仮想通貨(暗号通貨)の垂直棒グラフを作成する

    # Load stock data from the csv file
    csv_file = 'data/csv/article015/crypto.csv'
    df = pd.read_csv(csv_file)    
    df['Date'] = pd.to_datetime(df['Date']) # Convert str to datetime
    # Date	Symbols	Adj Close	Close	High	Low	Open	Volume
    
    # Plot a vartical bar chart (last_date, closing price) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index  
    
    for symbol in symbols:    
        filter_by = (grp.index == symbol)     
        grpx = grp[filter_by]     
        plt.bar(grpx.index, grpx.values, label=symbol)     
    
    plt.yscale('log')
    
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (円)')
    plt.title(f'Cryptocurrency Prices (仮想通貨(暗号通貨)価格)\n({last_date.strftime("%Y/%m/%d")})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    click image to zoom!
    図19

  3. 仮想通貨(暗号通貨)の垂直棒グラフを作成する(上位3)【NG版】

    # Plot a vartical bar chart (top three, ng version) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index[0:3]    # select 3 symbols
    
    date1 = '2021/09/13'
    date2 = '2021/09/17'
    filter_by = (df['Date'] >= date1) & (df['Date'] <= date2)
    dfx = df[filter_by]
    dfx.reset_index()
    
    for symbol in symbols:    
        filter_by = (df['Symbols'] == symbol) 
        dfy = dfx[filter_by]     
        grp = dfy.groupby('Date')['Close'].sum()
        plt.bar(grp.index, grp.values, label=symbol)     
    
    plt.yscale('log')
    
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (円)')
    plt.title(f'Cryptocurrency Prices (仮想通貨(暗号通貨)価格)\n({date1}~{date2})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    click image to zoom!
    図20

  4. 仮想通貨(暗号通貨)の垂直棒グラフを作成する(上位3)【改善版】

    # Plot a vartical bar chart (top 3 fixed version) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,6))              # 12,5
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index[0:3]    # select 3 symbols
    position = 3    # 3:left, 2:cener , 1:right
    width = 0.25
    
    date1 = '2021/09/13'
    date2 = '2021/09/17'
    filter_by = (df['Date'] >= date1) & (df['Date'] <= date2)
    dfx = df[filter_by]
    dfx.reset_index()
    
    for symbol in symbols:    
        filter_by = (df['Symbols'] == symbol) 
        dfy = dfx[filter_by]     
        grp = dfy.groupby('Date')['Close'].sum()
        x_indexes = np.arange(len(grp.index))   
        if position == 3:   # left bar?
            plt.bar(x_indexes - width, grp.values, width=width, label=symbol)    
        elif position == 2: # center bar?
            plt.bar(x_indexes, grp.values, width=width, label=symbol)   
        else:               # right bar
            plt.bar(x_indexes + width, grp.values, width=width, label=symbol) 
        position -= 1  
    
    plt.yscale('log')
    
    plt.xticks(ticks=x_indexes, labels=grp.index.strftime('%m/%d'))
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (円)')
    plt.title(f'Cryptocurrency Prices (仮想通貨(暗号通貨)価格)\n({date1}~{date2})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    click image to zoom!
    図21

  5. 仮想通貨(暗号通貨)の水平棒グラフを作成する

    # Plot a horizontal bar chart 
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(9,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    dfx.sort_values(by='Close', ascending=True, inplace=True)
    dfx.reset_index(inplace=True)
    
    for index, row in dfx.iterrows():
        plt.barh(row.Symbols, row.Close)
        plt.text(row.Close, index , str(int(row.Close)), fontsize=10)
    
    plt.xscale('log')
    
    #plt.xticks(rotation=45)
    plt.xlabel('Closing Price (円)')
    plt.title(f'Cryptocurrency Prices (仮想通貨(暗号通貨)価格)\n({last_date.strftime("%Y/%m/%d")})')
    plt.tight_layout()
    plt.show()
    
    # %%
    click image to zoom!
    図22

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

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # Article015_Matplotlib Bar Chart Part4 Crypto.py
    # %%
    
    # Import the necessary libraries  
    # %%
    import pandas as pd
    from pandas.core.frame import DataFrame
    from pandas.core.indexes.base import Index
    import pandas_datareader.data as web    # pip install pandas_datareader
    import matplotlib.pyplot as plt
    import matplotlib.style as style
    import mplfinance as mpf                # pip install mplfinance
    import datetime as dt
    import numpy as np
    import warnings
    warnings.simplefilter('ignore')
    
    # %%
    
    # Load Data from Yahoo Finace
    start = dt.datetime(2019, 1, 1)
    end = dt.datetime.now()
    crypto = ['BTC-JPY', 'ETC-JPY', 'LTC-JPY', 'XRP-JPY', 'SC-JPY']
    df = web.DataReader(crypto, 'yahoo', start=start, end=end)
    #print(df.info())
    #print(df.head(3))                       #print(df.tail(3))
    csv_file = 'data/csv/article015/crypto_before_Stack.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    df = df.stack().reset_index()           # Remove Symbols and reset date index 
    #print(df.info())
    #print(df.head(3))                      #print(df.tail(3))
    csv_file = 'data/csv/article015/crypto.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    # %%
    
    # Load stock data from the csv file
    csv_file = 'data/csv/article015/crypto.csv'
    df = pd.read_csv(csv_file)
    #print(df.info())       
    df['Date'] = pd.to_datetime(df['Date']) # Convert str to datetime
    #print(df.info())  
    # Date	Symbols	Adj Close	Close	High	Low	Open	Volume
    #print(df.head(5))
    
    # %%
    
    # Plot a vartical bar chart (last_date, closing price) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index  
    #print(grp)
    #print(grp.index)
    #print(grp.values)
    
    for symbol in symbols:    
        filter_by = (grp.index == symbol)     
        grpx = grp[filter_by]     
        #print(symbol)
        #print(grpx.index)    
        #print(grpx.values)   
        plt.bar(grpx.index, grpx.values, label=symbol)     
    
    plt.yscale('log')
    
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (円)')
    plt.title(f'Cryptocurrency Prices (仮想通貨(暗号通貨)価格)\n({last_date.strftime("%Y/%m/%d")})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # Plot a vartical bar chart (top three, ng version) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index[0:3]    # select 3 symbols
    #print(grp)
    #print(grp.index)
    #print(grp.values)
    date1 = '2021/09/13'
    date2 = '2021/09/17'
    filter_by = (df['Date'] >= date1) & (df['Date'] <= date2)
    dfx = df[filter_by]
    dfx.reset_index()
    
    for symbol in symbols:    
        filter_by = (df['Symbols'] == symbol) 
        dfy = dfx[filter_by]     
        grp = dfy.groupby('Date')['Close'].sum()
        plt.bar(grp.index, grp.values, label=symbol)     
    
    plt.yscale('log')
    
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (円)')
    plt.title(f'Cryptocurrency Prices (仮想通貨(暗号通貨)価格)\n({date1}~{date2})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # Plot a vartical bar chart (top 3 fixed version) 
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'  # Meiryo, Yu Gothic
    plt.style.use('fivethirtyeight')        # 'fivethirtyeight' 'ggplot'
    plt.figure(figsize=(12,6))              # 12,5
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    grp = dfx.groupby('Symbols')['Close'].sum().sort_values(ascending=False)	
    symbols = grp.index[0:3]    # select 3 symbols
    position = 3    # 3:left, 2:cener , 1:right
    width = 0.25
    
    date1 = '2021/09/13'
    date2 = '2021/09/17'
    filter_by = (df['Date'] >= date1) & (df['Date'] <= date2)
    dfx = df[filter_by]
    dfx.reset_index()
    
    for symbol in symbols:    
        filter_by = (df['Symbols'] == symbol) 
        dfy = dfx[filter_by]     
        grp = dfy.groupby('Date')['Close'].sum()
        x_indexes = np.arange(len(grp.index))   
        if position == 3:   # left bar?
            plt.bar(x_indexes - width, grp.values, width=width, label=symbol)    
        elif position == 2: # center bar?
            plt.bar(x_indexes, grp.values, width=width, label=symbol)   
        else:               # right bar
            plt.bar(x_indexes + width, grp.values, width=width, label=symbol) 
        position -= 1  
    
    plt.yscale('log')
    
    plt.xticks(ticks=x_indexes, labels=grp.index.strftime('%m/%d'))
    #plt.xticks(rotation=45)
    plt.ylabel('Closing Price (円)')
    plt.title(f'Cryptocurrency Prices (仮想通貨(暗号通貨)価格)\n({date1}~{date2})')
    plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%
    
    # Plot a horizontal bar chart 
    plt.style.use('fivethirtyeight')    # 'fivethirtyeight' 'ggplot'
    #plt.style.use('ggplot')    
    #plt.style.use('seaborn')    
    #plt.style.use('dark_background')  
    #plt.figure(figsize=(7,4))
    plt.figure(figsize=(9,5))
    
    # Get last date 
    last_date = df['Date'].max()
    dfx = df[ df['Date'] == last_date ]
    dfx.sort_values(by='Close', ascending=True, inplace=True)
    dfx.reset_index(inplace=True)
    
    for index, row in dfx.iterrows():
        #print(index, row.Symbols, row.Close)
        plt.barh(row.Symbols, row.Close)
        plt.text(row.Close, index , str(int(row.Close)), fontsize=10)
        #plt.text(row.Close+2, index , str(int(row.Close)), fontsize=10)
    
    plt.xscale('log')
    #plt.yscale('log')
    
    #plt.xticks(rotation=45)
    plt.xlabel('Closing Price (円)')
    plt.title(f'Cryptocurrency Prices (仮想通貨(暗号通貨)価格)\n({last_date.strftime("%Y/%m/%d")})')
    #plt.legend(loc='upper right')
    plt.tight_layout()
    plt.show()
    
    # %%