【Python】Plotly で複数のpandasデータフレームをサブプロットする方法考察

ここのところ経済関連の時系列データを取得し、グラフにしたい、それも関連データに関しては一つのFigureにサブプロットしたいと思うことが多く、色々試してみたのでそのまとめておきたいと思います。

まず前提として、Plotly expressのファセットプロットでは、あるデータフレーム内の要素を使ってサブプロットすることはできるが、複数のデータフレームの情報からグラフを作ることができない(難しい)ため、その他の方法を考察する。

(cufflinksを使ったplotlyでのプロットについても一つのデータフレーム内のデータをサブプロットすることは容易であるが、複数のデータフレームのデータを扱うことが難しい)

1. make_subplotsを利用する方法

まずは、plotly.subplotsのmake_subplotsを使った方法。

from plotly.subplots import make_subplots as ms

fig = ms(rows=2,cols=1,horizontal_spacing=0.05,specs=[[{'secondary_y':True}],[{'secondary_y':True}]],subplot_titles=['hoge','hoge'])
# ↑今回は使わないが必要ないがsecondary_yは有効にした例
# データはdataframe1とdataframe2に取得済みとする
for i in dataframe1:
    fig.add_scatter(x=dataframe1.index, y=dataframe1[i], row=1, col=1)
for j in dataframe2:
    fig.add_scatter(x=dataframe2.index, y=dataframe2[j], row=2, col=1)
fig.update_traces(hoge) # アップデートは必要に応じて
fig.update_layout(hoge)

make_subplotsに追加できるのはあくまでもtraceである。

そのため、cufflinksを使って、

fig1 = dataframe1.iplot(asFigure=True)
fig2 = dataframe2.iplot(asFigure=True)

などとしてfigure objectsをそれぞれ作ったとしても追加できない。

そのため、make_subplotsを利用して複数のデータフレームをサブプロットする場合には、面倒であってもforループでデータフレーム内の各時系列を処理する必要がありそう(知識不足なだけかもしれないが)。

2. Cufflinks.subplots()を使う方法

この方法に関してはfigure objectsレベルでのサブプロットが可能。

import cufflinks as cf
# データはすでにdataframe1とdataframe2に取得済みとする

fig = cf.Figure(cf.subplots([dataframe1.figure(kind='hoge'),dataframe2.figure(kind='hoge'],shape=(2,1))

このようにループ処理をすることなく、figureレベルでのサブプロットが可能であり、非常にシンプルに書ける。

ただし、cf.subplots()内でthemeを指定してもなぜだか反映させることができなかった。

これに関しては知識不足のためと思われるが、theme/templateの指定がしたい場合には今のところ使えない。