【Python】Plotly.go Subplotsチートシート

2025年4月8日

はじめに

データ分析にPlotlyを、共有のためにstreamlitを使用することがあります。

そこでいろんなグラフを作成していますがせっかくやったものを忘れてまた調べなおすのも馬鹿らしいということでここにチートシートを作成することにしました。

特にグラフを複数並べる、Subplot等についての情報はネットにも少なくリファレンスを探してがんばらないとけないので。

ちなみにこのシートはPlotly.goのみです。Plotly.expressで書けるような簡単なグラフは、調べればすぐできることであれば出てきます。

ここで書くのはほんの一部ですので最終的に本当にわからないときは公式リファレンスを見ましょう。

インポート

とりあえず以下のライブラリがあれば問題はないでしょう。

import pandas

import plotly.graph_objects as go
from plotly.subplots import make_subplots

Subplots

複数のグラフをまとめたグラフを作成したい場合にsubplotsを使用します。

fig = make_subplots(
  rows=2, # 行数
  cols=2, # 列数
  shared_xaxes=False, # 共通のx軸を使用するか
  shared_yaxes=True, # 共通のy軸を使用するか
  row_heights=[1,2], # 行の幅の比率
  column_widths=[1,1], # 列の幅の比率
  horizontal_spacing=0.05, # グラフ同士の空白の横幅サイズ
  vartical_spacing=0.05, # グラフ同士の空白の縦幅サイズ
  subplot_titles=["title1","title2","title3","title4"], # 各々のグラフタイトル
  specs=[[{"secondary_y":True},{}],[{},{}]] # 一つのグラフで二つの軸を使用するか
)

ここで作成したfigにグラフを追加していくことで複数のグラフをまとめて表示できる。

追加にはadd_traceを使用する。追加するグラフの作成方法はこの後記載する
1つのグラフで複数の軸を使用する場合はsecondary_yを指定する。
右軸を使用してプロットする場合はTrueを設定する。

fig.add_trace(
  go.Scatter(x=df['date'],y=df['count']), # このあとグラフの作成する方法を記載する
  row = 1, # 行
  col = 1, # 列
  secondary_y=True # 左右どちらの軸を使用するか
)

複数グラフにしない場合はgo.figure()を使用し、add_traceする際にrowとcolを指定しない。

fig = go.figure()
fig.add_trace(go.sccatter(x=df['date'],y=df['count']))

グラフ作成

散布図

fig.add_trace(
  go.scatter(
    x=df['date'], # x軸として使用するカラム
    y=df['count'], # y軸として使用するカラム
    name="count", # 凡例名
    color='black', # マーカーの色
    mode='markers', # モードの設定 ('markers+lines'とすると折れ線グラフを重ねて表示できる)
    marker=dict(size=1), # マーカーサイズ
    showlegend=True, # 凡例を表示するか
  ),
  row = 1,
  col = 1,
  secondary_y=True
)

折れ線グラフ

fig.add_trace(
  go.scatter(
    x=df['date'], # x軸として使用するカラム
    y=df['count'], # y軸として使用するカラム
    name="count", # 凡例名
    color='black', # 色
    mode='lines', # モードの設定
    stackgroup="one" #これを設定すると積み上げ折れ線グラフにできる
    showlegend=True, # 凡例を表示するか
  ),
  row = 1,
  col = 1,
  secondary_y=True
)

棒グラフ

fig.add_trace(
  go.Bar(
    x=df.index, # x軸として使用するカラム
    y=df["count"], # y軸として使用するカラム
    width=1, # 幅
    name="count", # 凡例名
    marker=dict(color="blue"), # 色
    yaxis="y1" # 使用する軸の名前 y1,y2のような形式で指定する
    text=df["count"] # 表示するテキスト
    textposition="auto", # どこにテキストを表示するか
    legend="legend1", # 凡例のまとまり legend1,legend2のような形式で指定する
    legendgroup="group1", # 凡例のグループ 任意の名前で凡例をまとめる
    legendgrouptitle_text="group_name", # 凡例グループの表示名
    showlegend=True, # 凡例を表示するか
   )
  row = 1,
  col = 1,
  secondary_y=True
)
# 積み上げ棒グラフを作成したい場合はupdate_layoutでbarmodeをstackにする。
fig.update_layout(
  barmode="stack",
)

箱ひげ

fig.add_trace(
  go.Box(
    x=df.index, # x軸として使用するカラム
    y=df["count"], # y軸として使用するカラム
    name="count", # 凡例名
    marker=dict(color="blue"), # 色
    showlegend=True, # 凡例を表示するか
   )
  row = 1,
  col = 1,
)

円グラフ

fig.add_trace(
  go.Pie(
    labels=df.index, # 分類するカラム
    value=df["count"], # 値として使用するカラム
    sort=True, # ソートするかどうか
    textinfo="parcent+value", # label,text,value,percentを使用可能
    direction="clockwise", # 何回りで表示するか clockwise:時計回り counterclockwise:反時計回り
    showlegend=True, # 凡例を表示するか
  )
)

fig.update_traces(marker=dict(colors=["red","blue"])) # 色

グラフ設定

x軸の設定(subplot共通)

subplotのすべてのx軸の設定を変更する。
時系列データをプロットする場合以下のように設定することで見やすくなる。

fig.update_xaxes(
  tickformatstops=[
     dict(dtickrange=[None,604800000],value="%Y/%m/%d\n%H:%M"),
     dict(dtickrange=[604800000,"M1"],value="%Y/%m/%d"),
     dict(dtickrange=["M1",None],value="%Y/%m/%d"),
  ],
)

y軸の設定(subplot共通)

subplotのすべてのy軸の設定を変更する。

fig.update_yaxes(
  title=dict(text="yaxis_title"), # y軸のタイトル
  fixedrange = True, # データから表示範囲を調整し固定する
)

subplotで特定のy軸の設定を変えたい場合はcolとrowを指定する。

fig.update_yaxes(
  title=dict(text="yaxis_title"), # y軸のタイトル
  range=[0,200], # 表示範囲
  row=1,
  col=1
)

レイアウト・凡例設定

グラフ全体の設定を変更する場合にupdate_layoutを使用する。
グラフのサイズ、軸の設定等はここで設定する。

fig.update_layout(
  title="title_name", # タイトル
  heigh=450, # 高さ
  width=250, # 横幅
  margin=dict(t=30,b=10,l=0,r=0), # 余白
  yaxis1=dict(side="left",range=([0,100])), # y1軸の設定
  yaxis2=dict(side="left",range=([0,100])), # y2軸の設定
  legend1=dict(groupclick="toggleitem",bgcolor="white",bordercolor="grey",borderwidth=1,title=dict(text=""),xanchor="left",yanchor="top",x=1.0,y=0), # 凡例の設定
)