Plotlyでpandas dataframeを対話的なグラフにする

pandasの.plot()メソッドで簡単にグラフの作成はできるが、

カーソルを当てた時に値が表示されなかったり動かせなかったりでは、不便ではないでしょうか。

そこで、Plotlyを使って簡単にインタラクティブな(対話的な)動きのあるグラフを書いてみたいと思います。

今回はいくつかの方法を比較しながら使ってみる。

  1. cufflinks と plotly.offlineを使う方法
  2. Plotting Backendを設定して.plot()メソッドを使う
  3. plotly.graph_objects を使う方法
  4. 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を使っています。