skip to content
barorin&

plotlyの複合グラフとトラブル対処|第2軸・アニメーション・表示エラー

/ 5 min read

Table of Contents

はじめに

売上金額と前年同期比のように、単位の違う2つの指標を1枚のグラフに並べたい場面は、財務データを扱っているとよく出てきます。金額は数百万単位、比率は0〜2程度なので、同じ軸に描くと比率のほうが潰れて見えません。

plotlyで複合グラフと第2軸を使う方法と、途中で引っかかったエラーの対処をまとめました。

棒グラフと折れ線を重ねて第2軸を使う

make_subplots で第2軸を有効にしてから、それぞれのグラフを追加します。

import plotly.graph_objects as go
from 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 installed

plotlyがJupyter上でグラフを描画するために必要な nbformat が入っていない(またはバージョンが古い)ことが原因です。

Terminal window
$ pip install --upgrade nbformat

animation_frame が動かない

animation_frame を指定してもアニメーションが再生されないことがあります。レンダラーを明示的に指定すると動くようになりました。

import plotly.io as pio
pio.renderers.default = "notebook"

これを animation_frame を使うコードより前に実行してください。

おわりに

plotlyのトラブルは、コードではなく表示環境まわりが原因であることがほとんどです。グラフが出ないときは、まずカーネルの再起動とレンダラーの確認を試すと、大半はそこで解決します。

この記事を書いた人

barorinのプロフィール画像

barorin公認会計士

会計とITの二足のわらじで働く公認会計士です。Pythonを中心に、会計・監査の実務で実際に使っているコードや、Ubuntu・Raspberry Piの設定メモを書いています。