plotlyの複合グラフとトラブル対処|第2軸・アニメーション・表示エラー
/ 5 min read
Table of Contents
はじめに
売上金額と前年同期比のように、単位の違う2つの指標を1枚のグラフに並べたい場面は、財務データを扱っているとよく出てきます。金額は数百万単位、比率は0〜2程度なので、同じ軸に描くと比率のほうが潰れて見えません。
plotlyで複合グラフと第2軸を使う方法と、途中で引っかかったエラーの対処をまとめました。
棒グラフと折れ線を重ねて第2軸を使う
make_subplots で第2軸を有効にしてから、それぞれのグラフを追加します。
import plotly.graph_objects as gofrom plotly.subplots import make_subplots
# 折れ線グラフ(前年同期比など)line_trace = go.Scatter( x=df["date"], y=df["前年比"], name="前年比",)
# 棒グラフ(売上金額など)bar_trace = go.Bar( x=df["date"], y=df["売上"], name="売上",)
# secondary_y を有効にするfig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(bar_trace, secondary_y=False) # 左軸fig.add_trace(line_trace, secondary_y=True) # 右軸
fig.show()add_trace() の secondary_y で、どちらの軸に載せるかを指定します。False が左軸、True が右軸です。
軸にラベルを付ける
どちらの軸が何を表しているか分からないと読めないグラフになるので、ラベルは必ず付けます。
fig.update_yaxes(title_text="売上(千円)", secondary_y=False)fig.update_yaxes(title_text="前年比", secondary_y=True)fig.update_layout(title="月次売上と前年同期比")ValueError: nbformat が not installed
Jupyterでグラフを表示しようとしたときに出るエラーです。
import plotly.express as px
gapminder = px.data.gapminder()px.scatter(gapminder, x="gdpPercap", y="lifeExp", log_x=True, hover_name="country")ValueError: Mime type rendering requires nbformat>=4.2.0 but it is not installedplotlyがJupyter上でグラフを描画するために必要な nbformat が入っていない(またはバージョンが古い)ことが原因です。
$ pip install --upgrade nbformatanimation_frame が動かない
animation_frame を指定してもアニメーションが再生されないことがあります。レンダラーを明示的に指定すると動くようになりました。
import plotly.io as pio
pio.renderers.default = "notebook"これを animation_frame を使うコードより前に実行してください。
おわりに
plotlyのトラブルは、コードではなく表示環境まわりが原因であることがほとんどです。グラフが出ないときは、まずカーネルの再起動とレンダラーの確認を試すと、大半はそこで解決します。
