Python {Article016}

ようこそ「Python」へ...

生データを使用してMatplotlibで散布図(scatter)を作成する方法を学ぶには【Pandas+Matplotlib】

ここではWebサイトで公開されて生データを使用してPandas+Matplotlibで散布図(scatter)を作成する方法を解説します。 最初に厚労省のWebサイトからCOVID-19のデータをダウンロードしてMatplotlibで散布図を作成する方法を説明します。 次に、Yahoo! FinanceからGAFAMの株価をダウンロードして散布図を作成する方法も説明します。 最後に、Yahoo! Financeから仮想通貨(暗号通貨)のビットコイン、イーサリアム等の価格をダウンロードして散布図を作成する方法も説明します。 また、散布図を綺麗に表示したいという人のためにPlotly Expressで「寿命とGDP」に関するデモも紹介します。

厚労省の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!
Amazon株価散布図
click image to zoom!
Bitcoin価格散布図
click image to zoom!
寿命/GDP散布図

まずは簡単な散布図(scatter)を作成してみる

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

    Visual Studio Codeを起動したら以下のコードを入力して実行[Ctrl+Enter]します。 行2-8ではPythonのライブラリを取り込んでいます。 行9ではPythonの警告メッセージを抑止しています。 行16では日本語が使えるようにCSSの「font.family」プロパティに「Meiryo」を設定しています。 行18-19ではX軸とY軸の値を定義しています。 行21ではmatplotlibのscatter()メソッドで散布図を作成しています。 scatter()の引数1にはX軸の値、引数2にはY軸の値を指定します。 行23でmatplotlibのshow()メソッドで図を表示しています。 インタラクティブ環境のときは不要です。
    # 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 scatter chart (no options)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    cases_x = [10, 20, 5, 90, 20, 60, 30, 80, 20]
    deaths_y = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    plt.scatter(cases_x, deaths_y)
    
    plt.show()
    
    # %%
    click image to zoom!
    図1
    図1は実行結果です。図にドットが表示されています。
  2. 散布図にfigsize, title, xlable, ylable, tight_layout等のオプションを追加する

    行9ではmatplotlibのfigure()メソッドで図のサイズを設定しています。 行11-13ではmatplotlibのscatter()メソッドの引数に「s, c, edgecolor, linewidth, alpha」のオプションを追加しています。 行15ではmatplotlibのtitle()メソッドで図のタイトルを設定しています。 行16-17ではmatplotlibのxlabel(), ylabel()メソッドで図のX軸とY軸のラベルを設定しています。 行19ではmatplotlibのtight_layout()メソッドで図が綺麗に表示されるようにしています。 この指定はNOTE-PCを使うときに効果があります。
    # Add options (style, title, xlabel, ylabel, tight_layout,...)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    cases_x = [10, 20, 5, 90, 20, 60, 30, 80, 20]
    deaths_y = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    plt.figure(figsize=(12,5))
    
    plt.scatter(cases_x, deaths_y, 
        s=100, c='green', edgecolor='black', 
        linewidth=1, alpha=0.75)
    
    plt.title('感染者・重症者散布図')
    plt.xlabel('感染者')
    plt.ylabel('重症者')
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    click image to zoom!
    図2
    図2は実行結果です。 図にタイトル、X軸、Y軸のラベルが表示されています。 また、ドットの色が「緑」に変わってサイズが大きくなっています。 さらにドットの周りが「黒」の線で囲まれています。 「alpha」の効果は目視できませんが適用されています。
  3. 散布図にsize, colors, color mapを追加する

    行9では散布図に表示するドットのサイズを定義しています。 値が大きくなればドットのサイズも大きくなります。 行11ではドットの色のスケールを定義しています。 値が大きくなれば色の濃淡が濃くなります。 行15-17ではmatplotlibのscatter()メソッドの引数に「s, c, cmap」のオプションを追加しています。 行19ではmatplotlibのcolorbar()メソッドで図の右端にカラーバー表示させています。 行20ではcolorbarのset_label()メソッドでカラーバーのラベルを設定しています。
    # Add Size, Colors, Color Map
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    cases_x = [10, 20, 5, 90, 20, 60, 30, 80, 20]
    deaths_y = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    sizes = [10, 20, 30, 40, 50, 60, 70, 80, 90]
    
    colors = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    plt.figure(figsize=(12,5))
    
    plt.scatter(cases_x, deaths_y, 
        s=sizes, c=colors, cmap='Greens', 
        edgecolor='black', linewidth=1, alpha=0.75)
    
    cbar = plt.colorbar()
    cbar.set_label('重症度')
    
    plt.title('感染者・重症者散布図')
    plt.xlabel('感染者')
    plt.ylabel('重症者')
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    click image to zoom!
    図3
    図3は実行結果です。図の右端にカラーバーとラベルが表示されています。
  4. ここで解説したコードをまとめて掲載

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # Article016_Matplotlib Scatter Chart Part1.py
    # %%
    
    # 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 scatter chart (no options)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    cases_x = [10, 20, 5, 90, 20, 60, 30, 80, 20]
    deaths_y = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    # cases_x = [10, 20, 30, 40, 50, 60, 70, 80, 90]
    # deaths_y = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    plt.scatter(cases_x, deaths_y)
    
    plt.show()
    
    # %%
    
    # Add options (style, title, xlabel, ylabel, tight_layout,...)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    cases_x = [10, 20, 5, 90, 20, 60, 30, 80, 20]
    deaths_y = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    plt.figure(figsize=(12,5))
    
    plt.scatter(cases_x, deaths_y, 
        s=100, c='green', edgecolor='black', linewidth=1, alpha=0.75)
    
    plt.title('感染者・重症者散布図')
    plt.xlabel('感染者')
    plt.ylabel('重症者')
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # Add Size, Colors, Color Map, Alpha,...
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    cases_x = [10, 20, 5, 90, 20, 60, 30, 80, 20]
    deaths_y = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    sizes = [10, 20, 30, 40, 50, 60, 70, 80, 90]
    
    colors = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    plt.figure(figsize=(12,5))
    
    plt.scatter(cases_x, deaths_y, s=sizes, 
        c=colors, cmap='Greens', edgecolor='black', 
        linewidth=1, alpha=0.75)
    
    cbar = plt.colorbar()
    cbar.set_label('重症度')
    
    plt.title('感染者・重症者散布図')
    plt.xlabel('感染者')
    plt.ylabel('重症者')
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    

COVIC-19(新型コロナ)の生データを使って散布図(scatter)を作成する

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

    # 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!
    図4

  2. 東京の感染者・重症者散布図を作成する

    # Draw a scatter chart (no options)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    # Select file_id = 'new_cases'
    filter_by = (raw['file_id'] == 'new_cases') 
    df = raw[filter_by]
    
    # Select prefecture = 'Tokyo'
    filter_by = (df['prefecture'] == 'Tokyo')
    dfx = df[filter_by]
    
    plt.scatter(dfx.new_cases, dfx.severe_cases)
    
    plt.show()
    
    # %%
    click image to zoom!
    図5

  3. 東京の感染者・重症者散布図にstyle, figure, title, xlabel, ylabel等を追加する

    # Add options (style, title, xlabel, ylabel, tight_layout,...)
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    #plt.style.use('seaborn')
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(12,5))
    
    plt.scatter(dfx.new_cases, dfx.severe_cases, 
        s=100, c='green', edgecolor='black', 
        linewidth=1, alpha=0.75)
    
    plt.title('感染者・重症者散布図')
    plt.xlabel('感染者')
    plt.ylabel('重症者')
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    click image to zoom!
    図6

  4. 東京の感染者・重症者散布図にsize, colors, color map, alpha等を追加する

    # Add Size, Colors, Color Map, Alpha,... 散布図(感染者・重症者)
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    #plt.style.use('seaborn')
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(12,8))  # 12,5
    
    filter_by = (df['date'] >= '2021-08-10')
    dfx = df[filter_by]
    
    plt.scatter(dfx.new_cases, dfx.severe_cases, 
        s=dfx.severe_cases, c=dfx.severe_cases, 
        cmap='Greens', edgecolor='black', 
        linewidth=1, alpha=0.75)     
    
    cbar = plt.colorbar()
    #cbar.set_label('重症度')
    
    plt.title('東京都の感染者・重症者散布図\n(2021/8/10~2021/9/22)')
    plt.xlabel('感染者')
    plt.ylabel('重症者')
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    click image to zoom!
    図7

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

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # 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'])
    
    # %%
    
    # Draw a scatter chart (no options)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    # Select file_id = 'new_cases'
    filter_by = (raw['file_id'] == 'new_cases') 
    df = raw[filter_by]
    
    # Select prefecture = 'Tokyo'
    filter_by = (df['prefecture'] == 'Tokyo')
    dfx = df[filter_by]
    
    plt.scatter(dfx.new_cases, dfx.severe_cases)
    
    plt.show()
    
    # %%
    
    # Add options (style, title, xlabel, ylabel, tight_layout,...)
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    #plt.style.use('seaborn')
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(12,5))
    
    plt.scatter(dfx.new_cases, dfx.severe_cases, 
        s=100, c='green', edgecolor='black', 
        linewidth=1, alpha=0.75)
    
    plt.title('感染者・重症者散布図')
    plt.xlabel('感染者')
    plt.ylabel('重症者')
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # Add Size, Colors, Color Map, Alpha,... 散布図(感染者・重症者)
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    #plt.style.use('seaborn')
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(12,8))  # 12,5
    
    filter_by = (df['date'] >= '2021-08-10')
    dfx = df[filter_by]
    
    plt.scatter(dfx.new_cases, dfx.severe_cases, 
        s=dfx.severe_cases, c=dfx.severe_cases, 
        cmap='Greens', edgecolor='black', 
        linewidth=1, alpha=0.75)     
    
    cbar = plt.colorbar()
    #cbar.set_label('重症度')
    
    plt.title('東京都の感染者・重症者散布図\n(2021/8/10~2021/9/22)')
    plt.xlabel('感染者')
    plt.ylabel('重症者')
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    

株価(GAFAM)の生データを使って散布図(scatter)を作成する

  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')
    
    # 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/article016/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/article016/stock.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    click image to zoom!
    図8

  2. Amazonの株価散布図(前年度同月比)を作成する

    # Draw a scatter chart (no options)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    # Select Symbols == 'AMZN' 
    filter_by = (df['Symbols'] == 'AMZN') 
    
    title='Amazon株価散布図\n(2020/3 vs 2021/3)'
    date1='2020-03' 
    date2='2021-03'
    dfx = df[filter_by]
    # Set index
    dfx = dfx.set_index('Date')
    
    # Select Date == '2020-03'
    df1 = dfx[date1]
    # Select Date == '2021-03'
    df2 = dfx[date2]
    
    dates1 = df1.index  # 2020-03-02, 2020-03-03, 2020-03-04,...
    dates2 = df2.index  # 2021-03-01, 2021-03-02, 2021-03-04,...
    
    days1 = [x.day for x in dates1.tolist()]    # 2,3,4,...
    days2 = [x.day for x in dates2.tolist()]    # 1,2,3,...
    
    if len(days1) != len(days2):
        days_diff = list(set(days1) - set(days2))
        for ix, item in enumerate(days_diff):
            i = days1.index(item) 
            df1.drop(dates1[i], inplace=True )
        days_diff = list(set(days2) - set(days1))
        #print(days_diff)
        for ix, item in enumerate(days_diff):
            i = days2.index(item)
    
            df2.drop(dates2[i], inplace=True )
    
    plt.scatter(df1.Close, df2.Close)
    
    plt.show()
    
    # %%
    click image to zoom!
    図9

  3. Amazonの株価散布図にstyle, title, xlabel, ylabel, tight_layout等を追加する

    # Add options (style, title, xlabel, ylabel, tight_layout,...)
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(12,5))
    
    plt.scatter(df1.Close, df2.Close, 
        s=100, c='green', edgecolor='black', 
        linewidth=1, alpha=0.75)
    
    plt.title(title)
    plt.xlabel(date1)
    plt.ylabel(date2)
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    click image to zoom!
    図10

  4. Amazonの株価散布図にsize, colors, color map, alpha,..等を追加する

    # Add Size, Colors, Color Map, Alpha,..
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    #plt.style.use('seaborn')
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(13,10.8))  # 12,5
    
    plt.scatter(df1.Close, df2.Close, 
        s=df2.Close, c=df2.Close, 
        cmap='Greens', edgecolor='black', 
        linewidth=1, alpha=0.75) 
    
    cbar = plt.colorbar()
    cbar.set_label('価格差')
    
    plt.title(title)
    plt.xlabel(date1)
    plt.ylabel(date2)
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    click image to zoom!
    図11

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

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # 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/article016/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/article016/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/article016/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))
    
    # %%
    
    # Draw a scatter chart (no options)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    # Select Symbols == 'AMZN' 
    filter_by = (df['Symbols'] == 'AMZN') 
    #filter_by = (df['Symbols'] == 'GOOGL') 
    #filter_by = (df['Symbols'] == 'AAPL') 
    #filter_by = (df['Symbols'] == 'MSFT') 
    #filter_by = (df['Symbols'] == 'FB') 
    
    title='Amazon株価散布図\n(2020/3 vs 2021/3)'
    date1='2020-03' 
    date2='2021-03'
    dfx = df[filter_by]
    # Set index
    dfx = dfx.set_index('Date')
    
    # Select Date == '2020-03'
    df1 = dfx[date1]
    # Select Date == '2021-03'
    df2 = dfx[date2]
    
    dates1 = df1.index  # 2020-03-02, 2020-03-03, 2020-03-04,...
    dates2 = df2.index  # 2021-03-01, 2021-03-02, 2021-03-04,...
    
    days1 = [x.day for x in dates1.tolist()]    # 2,3,4,...
    days2 = [x.day for x in dates2.tolist()]    # 1,2,3,...
    
    if len(days1) != len(days2):
        days_diff = list(set(days1) - set(days2))
        for ix, item in enumerate(days_diff):
            i = days1.index(item)
            df1.drop(dates1[i], inplace=True )
        days_diff = list(set(days2) - set(days1))
        for ix, item in enumerate(days_diff):
            i = days2.index(item)
            df2.drop(dates2[i], inplace=True )
    
    plt.scatter(df1.Close, df2.Close)
    
    plt.show()
    
    # %%
    
    # Add options (style, title, xlabel, ylabel, tight_layout,...)
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    #plt.style.use('seaborn')
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(12,5))
    
    plt.scatter(df1.Close, df2.Close, 
        s=100, c='green', edgecolor='black', 
        linewidth=1, alpha=0.75)
    
    plt.title(title)
    plt.xlabel(date1)
    plt.ylabel(date2)
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # Add Size, Colors, Color Map, Alpha,..
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    #plt.style.use('seaborn')
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(13,10.8))  # 12,5
    
    plt.scatter(df1.Close, df2.Close, 
        s=df2.Close, c=df2.Close, 
        cmap='Greens', edgecolor='black', 
        linewidth=1, alpha=0.75) 
    
    cbar = plt.colorbar()
    cbar.set_label('価格差')
    
    plt.title(title)
    plt.xlabel(date1)
    plt.ylabel(date2)
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    

仮想通貨(暗号通貨)(BTC,ETC,LTC,XRP)の生データを使って散布図(scatter)を作成する

  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)
    #print(df.info())
    #print(df.head(3))                       #print(df.tail(3))
    csv_file = 'data/csv/article016/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/article016/crypto.csv'
    df.to_csv(csv_file, index=False)        #df.to_csv(csv_file)
    
    # %%
    click image to zoom!
    図12

  2. ビットコインの価格散布図(前年度同月比)を作成する

    # Load stock data from the csv file
    csv_file = 'data/csv/article016/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))
    
    # Draw a scatter chart (no options)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    # Select Symbols == 'BTC-JPN' 
    # crypto = ['BTC-JPY', 'ETC-JPY', 'LTC-JPY', 'XRP-JPY', 'SC-JPY']
    filter_by = (df['Symbols'] == 'BTC-JPY') 
    #filter_by = (df['Symbols'] == 'ETC-JPY') 
    #filter_by = (df['Symbols'] == 'XRP-JPY') 
    
    title='BTC-JPY価格散布図\n(2020/3 vs 2021/3)'
    date1='2020-03' 
    date2='2021-03'
    
    dfx = df[filter_by]
    # Set index
    dfx = dfx.set_index('Date')
    
    # Select Date == '2020-03'
    df1 = dfx[date1]
    # Select Date == '2021-03'
    df2 = dfx[date2]
    
    dates1 = df1.index  # 2020-03-02, 2020-03-03, 2020-03-04,...
    dates2 = df2.index  # 2021-03-01, 2021-03-02, 2021-03-04,...
    
    days1 = [x.day for x in dates1.tolist()]    # 2,3,4,...
    days2 = [x.day for x in dates2.tolist()]    # 1,2,3,...
    
    if len(days1) != len(days2):
        days_diff = list(set(days1) - set(days2))
        for ix, item in enumerate(days_diff):
            i = days1.index(item)
            df1.drop(dates1[i], inplace=True )
        days_diff = list(set(days2) - set(days1))
        for ix, item in enumerate(days_diff):
            i = days2.index(item)
            df2.drop(dates2[i], inplace=True )
    
    plt.scatter(df1.Close, df2.Close)
    
    plt.show()
    
    # %%
    click image to zoom!
    図13

  3. ビットコインの価格散布図にstyle, title, xlabel, ylabel, tight_layout等を追加する

    # Add options (style, title, xlabel, ylabel, tight_layout,...)
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(12,5))
    
    plt.scatter(df1.Close, df2.Close, 
        s=100, c='green', edgecolor='black', 
        linewidth=1, alpha=0.75)
    
    plt.title(title)
    plt.xlabel(date1)
    plt.ylabel(date2)
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    click image to zoom!
    図14

  4. ビットコインの価格散布図にsize, colors, color map, alpha等を追加する

    # Add Size, Colors, Color Map, Alpha,..
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(13,10.8))  # 12,5
    
    plt.scatter(df1.Close, df2.Close, 
        s=300, 
        c=df2.Close, cmap='Greens', edgecolor='black', 
        linewidth=1, alpha=0.75)     
    
    cbar = plt.colorbar()
    cbar.set_label('価格差')
    
    plt.title(title)
    plt.xlabel(date1)
    plt.ylabel(date2)
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    click image to zoom!
    図15

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

    最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
    
    # 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/article016/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/article016/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/article016/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))
    
    # %%
    
    # Draw a scatter chart (no options)
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    # Select Symbols == 'BTC-JPN' 
    # crypto = ['BTC-JPY', 'ETC-JPY', 'LTC-JPY', 'XRP-JPY', 'SC-JPY']
    filter_by = (df['Symbols'] == 'BTC-JPY') 
    #filter_by = (df['Symbols'] == 'ETC-JPY') 
    #filter_by = (df['Symbols'] == 'XRP-JPY') 
    
    title='BTC-JPY価格散布図\n(2020/3 vs 2021/3)'
    date1='2020-03' 
    date2='2021-03'
    
    dfx = df[filter_by]
    # Set index
    dfx = dfx.set_index('Date')
    
    # Select Date == '2020-03'
    df1 = dfx[date1]
    # Select Date == '2021-03'
    df2 = dfx[date2]
    
    dates1 = df1.index  # 2020-03-02, 2020-03-03, 2020-03-04,...
    dates2 = df2.index  # 2021-03-01, 2021-03-02, 2021-03-04,...
    
    days1 = [x.day for x in dates1.tolist()]    # 2,3,4,...
    days2 = [x.day for x in dates2.tolist()]    # 1,2,3,...
    
    if len(days1) != len(days2):
        days_diff = list(set(days1) - set(days2))
        for ix, item in enumerate(days_diff):
            i = days1.index(item)
            #print(f'Removed row {dates1[i]} from df1')   
            df1.drop(dates1[i], inplace=True )
        days_diff = list(set(days2) - set(days1))
        for ix, item in enumerate(days_diff):
            i = days2.index(item)
            #print(f'Removed row {dates2[i]} from df2')   
            df2.drop(dates2[i], inplace=True )
    
    plt.scatter(df1.Close, df2.Close)
    
    plt.show()
    
    # %%
    
    # Add options (style, title, xlabel, ylabel, tight_layout,...)
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(12,5))
    
    plt.scatter(df1.Close, df2.Close, 
        s=100, c='green', edgecolor='black', 
        linewidth=1, alpha=0.75)
    
    plt.title(title)
    plt.xlabel(date1)
    plt.ylabel(date2)
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    
    # Add Size, Colors, Color Map, Alpha,..
    
    plt.style.use('fivethirtyeight')    # plt.style.available
    #plt.style.use('seaborn')
    
    # Set the font to support Japanese
    plt.rcParams['font.family'] = 'Meiryo'
    
    plt.figure(figsize=(13,10.8))  # 12,5
    
    plt.scatter(df1.Close, df2.Close, 
        s=300, 
        c=df2.Close, cmap='Greens', edgecolor='black', 
        linewidth=1, alpha=0.75)     
    
    cbar = plt.colorbar()
    cbar.set_label('価格差')
    
    plt.title(title)
    plt.xlabel(date1)
    plt.ylabel(date2)
    
    plt.tight_layout()
    
    plt.show()
    
    # %%
    

Plotly Expessで「寿命とGDP」に関する散布図(scatter)を作成する【DEMO】

  1. Plotly Expressのデモ用のデータで寿命とGDPの散布図を作成する

    行2-3ではPythonのライブラリを取り込んでいます。 行8ではPloty Expessのdata.gapminder()メソッドでDEMO用のデータを取り込んでPandasのDataFrameに格納しています。 図16-1でPandasのDataFrameの列と内容を表示しているので参照してください。 行11-23ではPloty Expressのscatter()メソッドで散布図を作成しています。 scatter()の引数data_frameにはPandasのDataFrameを指定しています。 引数xにはDataFrameの列「gdpPercap」を指定しています。 引数yにはDataFrameの列「lifeExp」を指定しています。 引数sizeにはDataFrameの列「pop」を指定しています。 引数colorにはDataFrameの列「continent」を指定しています。 行25では散布図を表示しています。 図を保存するときは行28のコメントを外してください。 散布図をブラウザに表示してアニメーション化させるには行31のコメントを外してください。 PandasのDataFrameの内容を保存したいときは行33のコメントを外してください。
    # Scatter chart for Life Span and Wealth usong Ploty Express
    import plotly 
    import plotly.express as px		# pip install plotly-express
    # also install nbformat		  	  pip install nbformat
    # also install kakeido 			  pip install -U kaleido
    
    # Get data
    df = px.data.gapminder()
    
    # plotly express scatter chart
    fig = px.scatter(data_frame=df,
    	x='gdpPercap',
    	y='lifeExp',
    	size='pop',
    	color='continent',
    	title='Life Span and Wealth 1952 - 2007',
    	labels={'gdpPerCap': 'Wealth','lefeExp': 'Life Span'},
    	log_x=True,
    	range_y=[25,95],
    	hover_name='country',
    	animation_frame='year',
    	height=600,
    	size_max=100)
    
    fig.show()
    
    # save fig
    #fig.write_image("data/png/lifeExp.png")	# pip install -U kaleido
    
    # html file
    #plotly.offline.plot(fig, filename='data/html/lifeExp.html')
    
    #df.to_csv('data/csv/world/Life_Span_and_Wealth.csv')
    
    # %%
    click image to zoom!
    図16-1
    図16-1はインタラクティブ・ウィンドウから「df.info()」、「df.head(3)」を入力して実行した結果です。 PandasのDataFrameには列(country, continent, year, lifeExp, pop, gdpPerCap,...)などがあり、 Plotly Expressでこれらの列を使用して散布図を作成しています。
    click image to zoom!
    図16-2
    図16-2は行25の「fig.show()」で表示した実行結果です。
    click image to zoom!
    図16-3
    図16-3は行31の「plotly.offline.plot()」で表示した実行結果です。 htmlファイルにplotするとブラウザに散布図が表示されます。 さらに散布図がアニメーション化されて動くようになります。