【Python】Plotly で複数のpandasデータフレームをサブプロットする方法考察
- 2021.06.07
- Python
ここのところ経済関連の時系列データを取得し、グラフにしたい、それも関連データに関しては一つの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の指定がしたい場合には今のところ使えない。
-
前の記事
【Python】 世界銀行のTCdata360 APIからデータ取得 2021.06.07
-
次の記事
Plotlyでグループ化された積上げ棒グラフを作る方法 2021.06.07