Markets & Python & ...

機関投資家の卵がPythonのコードと共に金融マーケットについて浅くつぶやきます

US州ごと新規感染者数トレンド推移をPlotlyで描画する

前回記事のグラフをPlotlyで描画してみた

hiroshimaeasygogo.hatenadiary.com

前回はUSの州ごとの新規感染者数の推移を、季節調整を施したトレンドラインでmatplotlibを使って描画した。
しかしlegend(つまり凡例)が見づらく、どこが増えていてどこが減っているのかmatplotlibではわかりづらいという話をした。
ということで今回はplotlyを使ってグラフを描画してみたので、参考にしてもらえれば幸いだ。
残念ながらstaked area plot(積み上げ面グラフ)の描き方が上手くいかなかったので、stacked bar chart(積み上げ棒グラフ)になってしまったが(実数ではなくトレンドラインを示すのに棒グラフは何となく不自然)、傾向が掴めればそれでよしとしよう。

https://chart-studio.plotly.com/~hiroshimaeasyryo/159.embed

前回触れた通りブログ内に埋め込みができないのでリンクから飛んで見てきてほしい。

コードスニペット

途中まで前回と一緒ですが一応載せておきます。

import pandas as pd
import numpy as np
import pprint
import datetime
import matplotlib.pyplot as plt
import seaborn as sns


row_data = pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_US.csv')
states_df = row_data.groupby('Province_State')

df_list = []
for dl in states_df:
    pd.DataFrame(dl)
    df_list.append(dl)
    
daily_list = []
for i in range(len(df_list)):
    daily_list.append(df_list[i][1].T[11:].sum(axis=1))
daily_df = pd.DataFrame(daily_list).T

states_list = []
for dl in range(len(df_list)):
    states_list.append(df_list[dl][0])
daily_df.columns = states_list    
daily_cases = daily_df.diff().dropna()
daily_cases.where(daily_cases > 0, 0, inplace=True)

day_cas_rol = daily_cases.rolling(7).mean().dropna()

# ここから追記
# plotlyで描画
# chart studioでオンライン上で表示する為にはchart studioの登録とapi keyの設定が必要
import chart_studio.plotly as py
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# オフラインでnotebook上で見る場合はこの2行が必要
import plotly.offline as offline
offline.init_notebook_mode(connected=False)

traces = []
for t in range(len(day_cas_rol.columns)):
    traces.append('traces_' + str(t))
    
for s in range(len(traces)):
    traces[s] = go.Bar(
        x=day_cas_rol.index,
        y=day_cas_rol[day_cas_rol.columns[s]],
        name=day_cas_rol.columns[s]
    )

layout = go.Layout(barmode='stack')
fig = go.Figure(data=traces, layout=layout)
py.plot(fig)

# オフラインで見る場合はこちら
offline.iplot(fig)