Plotlyでpandas dataframeを対話的なグラフにする
- 2021.06.06
- Python
pandasの.plot()メソッドで簡単にグラフの作成はできるが、
カーソルを当てた時に値が表示されなかったり動かせなかったりでは、不便ではないでしょうか。
そこで、Plotlyを使って簡単にインタラクティブな(対話的な)動きのあるグラフを書いてみたいと思います。
今回はいくつかの方法を比較しながら使ってみる。
- cufflinks と plotly.offlineを使う方法
- Plotting Backendを設定して.plot()メソッドを使う
- plotly.graph_objects を使う方法
- plotlyのラッパーであるplotly.express を使う方法
1. cufflinks と plotly.offline
cufflinksはplotlyとpandasをつなぐために使うためにインポートするが、
実際のところは、それ以外では登場しない。
import cufflinks as cf
import pandas as pd
import plotly.offline as ploy
これらをインポートして下準備は終了。
あとは、
df = pd.DataFrame('hogehoge')
df.iplot(asFigure=True) # .plot()の代わりに.iplot()を使う
ploy.iplot(fig) # グラフの表示
のようにして、dataframeに.iplot()メソッドを使うだけ。
これでいつものグラフが動きのあるグラフになる。
また、この方法の利点としては、この後紹介する方法に比べ、遥かにサブプロットが作りやすい
df.iplot(asFigure=True, subplots=True)
このようにsubplots=Trueを引数に含めれば、簡単に各列のバリューで複数グラフにしてくれる。
2. Plotting Backend を設定して.plot()メソッドを使う
こちらの方法もすこぶる簡単
コードとしては、
import pandas as pd
pd.options.plotting.backend = 'plotly' # Plotting Backendでplotlyでのプロットを指定
df = pd.DataFrame('hogehoge')
fig = df.plot()
fig.show()
上記のように、pd.options.plotting.backend='plotly'
と書いておき、.plot()メソッドでdataframeをプロットするだけで、自動的にplotlyでインタラクティブなグラフにすることができる。
3. plotly.graph_objects
この方法は少し面倒だし、前述のものに比べて複雑になる。
ただ、同じ複数のデータフレームでグラフを作る(サブプロットや2軸など)場合には、結局これになるのかもしれない。
ここでは、make_subplots と組み合わせて、2軸を利用したグラフの作成例をのせておく。
(以前の雇用統計に関する記事で使ったグラフ作成時のコード)
import pandas_datareader.data as web # データ取得用のモジュールなので気にせず
import plotly.graph_objects as go
from plotly.subplots import make_subplots as ms
df = web.DataReader(['EMRATIO','LNS12300060','UNRATE'],'fred',start=2005)
# dataframeとしてデータ取得
fig = ms(specs=[[{'secondary_y':True}]]) # y軸を2軸使用に
fig.add_trace(go.Scatter(x=df.index,y=df['EMRATIO'],name='E/P', mode='lines+markers'), secondary_y=False)
fig.add_trace(go.Scatter(x=df.index,y=df['LNS12300060'],name='E/P 25-54',mode='lines+markers',marker_color='rgb(0,100,150)'),secondary_y=False)
fig.add_trace(go.Scatter(x=df.index,y=df['UNRATE'],name='unemployment rate',mode='lines+markers',marker_color='rgb(0,150,0)'),secondary_y=True)
fig.update_layout(plot_bgcolor='rgb(230,230,230)',paper_bgcolor='rgb(240,240,240)',legend=dict(x=-.1, y=1.2))
# plot_bgcolorはplot areaのバックグラウンドカラーを指定
# paper_bgcolor='hoge'をつければグラフの外枠の色を指定できる
fig.update_yaxes(title_text='<b>E/P</b>',secondary_y=False)
fig.update_yaxes(title_text='<b>unemployment rate</b>',secondary_y=True)
plotly.graph_objectsを使ってプロットしているのは、
fid.add_trace(go.Scatter(x=’hoge’,y=’hoge’)の部分である。
他の方法に比べて、わざわざx軸とy軸のデータを指定する必要があるので、少し面倒に感じるかもしれない。
しかし、y軸を2軸にし、どのデータがどちらのy軸に従って表示するのかなどを設定する場合には、この書き方になるのではないかと思う。
(簡単なやり方を知らないだけかも、、、)
4. Plotly.expressを使う
plotly.expressはplotlyのラッパーなだけあって、ものすごく簡単に使える
import pandas as pd
import plotly.express as px
df = pd.DataFrame('hogehoge')
fig = px.scatter(df) # dfデータを散布図にする
たったこれだけでdataframeをインタラクティブなグラフにできる。
まとめ
ここからは個人的な使い分けだが、
基本的なところは、cufflinksとplotly.offlineの組み合わせが便利なように思う。
subplotsが一番作りやすいように思っている。
ただし、y軸を2軸にしたり、そのうえでサブプロットしたり、複数のdataframeからグラフを作る場合には、
渋々plotly.graph_objestsを使っています。
-
前の記事
人的資本と資産運用| 自分自身の価値と性質からポートフォリオを考える 2021.06.05
-
次の記事
【Python】 世界銀行のTCdata360 APIからデータ取得 2021.06.07