見出し画像

Python.04 グラフ作成(縦軸の左右で異なる目盛りにする)

おはようございます。
Y軸左右の目盛りを別で設定して、異なる二つのグラフを重ね合わせる方法について書きます。

使用データ

使用するデータは前回に引き続き、
厚生労働省「データからわかる-新型コロナウイルス感染症情報-」より、
オープンデータ(CSV形式)を使用。
1)新規陽性者数の推移(日別):newly_confirmed_cases_daily.csv
2)死亡者数の推移:number_of_deaths_daily.csv

前処理は、Python.01 データ前処理のとおり。
日付をindexにする形で読み込み、週ごとに集計した形でデータを用意しています。欠損値、データ型などは処理済み(実際には必要なかった!使いやすい)。
1)newly_confirmed_cases_daily.csv → df_W
2)number_of_deaths_daily.csv → df_death_W

それぞれのグラフ

まず、これまで通り、個別にグラフを作ってみます。
新型コロナウィルス陽性者数
(元データnewly_confirmed_cases_daily.csv → 週ごと集計df_W)

import pandas as pd
import numpy as np
import datetime
%matplotlib inline
import matplotlib.pyplot as plt      # グラフのための宣言
import matplotlib.dates as mdates # 時系列データのグラフのための宣言
sxmin='2021-05-01'
sxmax='2023-01-08'
xmin = datetime.datetime.strptime(sxmin, '%Y-%m-%d')
xmax = datetime.datetime.strptime(sxmax, '%Y-%m-%d')
plt.xlim([xmin,xmax])                       # ここでx軸の範囲を指定

plt.title('COVID19')              # 表ラベル
plt.xlabel('Date')                # X軸ラベル
plt.ylabel('Count')               # Y軸ラベル
plt.grid(which='major',axis='both',color='#999999',linestyle='--')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d-%b-%Y'))
plt.gcf().autofmt_xdate()

# 都道府県別データですが国民全体数をみたいので ALL 列を指定、色は青(b)、ラベルを指定
plt.plot(df_W['ALL'], color='b', label=u'COVID19_ALL')
plt.legend()                      # 凡例表示
fnameF='./img/COVID19.jpg'        # 生成画像を保存
plt.savefig(fnameF, dpi=200, bbox_inches="tight", pad_inches=0.1)

plt.show()
新規陽性者数、国民全体(df_W['ALL'])のグラフ表示結果

同様に、コロナによる死亡者
(元データnumber_of_deaths_daily.csv → 週ごと集計df_death_W)

sxmin='2021-05-01'
sxmax='2023-01-08'
xmin = datetime.datetime.strptime(sxmin, '%Y-%m-%d')
xmax = datetime.datetime.strptime(sxmax, '%Y-%m-%d')
plt.xlim([xmin,xmax])

plt.title('death')    # 表ラベル
plt.xlabel('Date')
plt.ylabel('Counts')
plt.grid(which='major',axis='both',color='#999999',linestyle='--')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d-%b-%Y'))
plt.gcf().autofmt_xdate()

# 国民全体なので ALL列指定、色は黒(k)、ラベルを指定
plt.plot(df_death_W['ALL'], color='k', label=u'death_ALL')

fnameF='./img/COVID-19_death.jpg'
plt.savefig(fnameF, dpi=200, bbox_inches="tight", pad_inches=0.1)
plt.legend()
plt.show()
死亡者数、国民全体(df_death_W['ALL'])のグラフ表示結果

一緒の形だね!と言うことはわかりますが、詳細が分かりにくいので重ね合わせて二つ一度に見たいと思います。
ただし、縦軸を見るともちろん人数の絶対数が大きく異なるので、そのまま重ねるとこうなります。

sxmin='2021-05-01'
sxmax='2023-01-08'
xmin = datetime.datetime.strptime(sxmin, '%Y-%m-%d')
xmax = datetime.datetime.strptime(sxmax, '%Y-%m-%d')
plt.xlim([xmin,xmax]) #ここでx軸の範囲を指定 

plt.title('death')       #表ラベル 
plt.xlabel('Date')    #軸ラベル 
plt.ylabel('Counts')
plt.grid(which='major',axis='both',color='#999999',linestyle='--')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d-%b-%Y'))
plt.gcf().autofmt_xdate()

plt.plot(df_W['ALL'], color='b', label=u'COVID19_ALL')
plt.plot(df_death_W['ALL'], color='k', label=u'death_ALL')

fnameF='./img/02death.jpg'
plt.savefig(fnameF, dpi=200, bbox_inches="tight", pad_inches=0.1)
plt.legend()
plt.show()
2つのデータを同時に表示させた結果、死者が0に見える?

縦軸の値が違いすぎて、比較できない。
まるで死亡者などいないかのように見えてしまいますね。

縦軸の目盛りを2種表示させる(左右別にする)

グラフの左側と右側にそれぞれ異なる数値を設定することで、二つのグラフの時系列(x軸)変化を比較しやすいようにします。

fig, ax1 = plt.subplots()                        # グラフ
ax2 = ax1.twinx()                                # 2軸表示

plt.title("COVID19 & DEATHS", fontsize=15) # グラフタイトルを付ける

sxmin='2021-05-01'
sxmax='2023-01-08'
xmin = datetime.datetime.strptime(sxmin, '%Y-%m-%d')
xmax = datetime.datetime.strptime(sxmax, '%Y-%m-%d')
plt.xlim([xmin,xmax])

plt.xlabel('date')                               # X軸ラベル
plt.grid(which='major',axis='both',color='#999999',linestyle='--')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d-%b-%Y'))
plt.gcf().autofmt_xdate()

# 2軸グラフの本体設定
ax1.plot(df_W['ALL'], color='b', label=u'COVID19')
ax2.plot(df_deaths_W['ALL'], color='k', label=u'Deaths')

# 凡例の表示のため、handler1と2にはグラフオブジェクトのリスト情報が入る
# label1と2には、凡例用に各labelのリスト情報が入る
handler1, label1 = ax1.get_legend_handles_labels()
handler2, label2 = ax2.get_legend_handles_labels()
# 凡例をまとめて出力する
ax1.legend(handler1 + handler2, label1 + label2, loc=1, borderaxespad=0.)
ax1.set_ylim([0, 200000+max(df_W['ALL'])])
ax2.set_ylim([0, 2000+max(df_deaths_W['ALL'])])

fnameF='./img/01deaths.jpg'
plt.savefig(fnameF, dpi=200, bbox_inches="tight", pad_inches=0.1)
plt.show()
2軸グラフの出力結果

比較しやすくなりました。
ピークの山がちょうど1ヶ月ずつずれて来ていることがわかりました。

まとめ

グラフ表示までは良かったのですが
2軸グラフには苦労しました。あちこち調べて、もっとスマートな書き方があるのかもしれません。
これで2軸比較がしやすくなったのでこれを多用して、COVID19と気候の記事を書きました。厚生労働省のデータが使いやすいので勉強にはピッタリだっと思います。下記の記事は結論迷子になっていますね。なんとかしたいところではあります。

今日も読んでいただき、ありがとうございました。

よろしければサポートお願いいたします。いただいたサポートは勉強のための書籍購入費に使う予定です。