ここでは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]をクリックします。
画像の任意の場所をクリックして閉じることもできます。
-
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()
# %%
図1は実行結果です。matplotlibはX軸、Y軸の値を指定するだけで簡単に垂直棒グラフが作成できます。
-
棒グラフにオプションを追加する
行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()
-
棒グラフに大阪と埼玉を追加する▶棒が重ねて作成される
行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()
図3は実行結果です。東京、大阪、埼玉の棒が重なって表示されます。
次のステップではこれらの棒が重ならないようにします。
-
棒グラフが重ならないようにする
行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()
図4は実行結果です。図3のように棒が重ならないで表示されています。
-
棒グラフにスタイルを追加する
行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()
図5は実行結果です。棒グラフに「fivethirtyeight」のスタイルが適用されています。
TIP1:スタイルの一覧を表示するには?
インタラクティブ・ウィンドウに「plt.style.available」を入力して[shift+enter]で実行するとスタイルの一覧が表示されます。
スタイルのおすすめは「fivethirtyeight, ggplot」などです。
スタイルを書き換えて色々試してみてください。
TIP2:棒グラフを手書き風に見せるには?
棒グラフを手書き風に見せるには「plt.xkcd()」を追加します。
ただし、フォントがリセットさせるので「plt.rcParams['font.family'] = 'Meiryo'」のようにフォント名を追加して再度設定する必要があります。
このとき「手書き風」のフォント名を指定します。
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# 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()
# %%
-
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'])
-
日別感染者の垂直棒グラフを作成する▶棒が重ねて表示される
# 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()
-
日別感染者の垂直棒グラフを作成する(上位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()
-
累計発症者の水平棒グラフを作成する(上位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()
-
累計死亡者の水平棒グラフを作成する(上位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()
-
累計死亡者の水平棒グラフを作成する(下位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()
-
累計重症者の水平棒グラフを作成する(上位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()
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# 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の株価をダウンロードして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)
-
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()
# %%
-
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()
# %%
-
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()
# %%
-
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()
# %%
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
#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()
# %%
-
仮想通貨(暗号通貨)の価格データをダウンロードして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)
# %%
-
仮想通貨(暗号通貨)の垂直棒グラフを作成する
# 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()
# %%
-
仮想通貨(暗号通貨)の垂直棒グラフを作成する(上位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()
# %%
-
仮想通貨(暗号通貨)の垂直棒グラフを作成する(上位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()
# %%
-
仮想通貨(暗号通貨)の水平棒グラフを作成する
# 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()
# %%
-
ここで解説したコードをまとめて掲載
最後にここで解説したすべてのコードをまとめて掲載しましたので参考にしてください。
# 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()
# %%