Plotly
で複数のグラフを1つのグラフとして表示するサブプロットを作成する方法を紹介する。主にfig.make_subplots
を使うが、domain
やfig.set_subplots
を使う方法も解説する。
複数のグラフを同時に独立して表示させたい人はぜひとも読み進め、サブプロットを作成する方法を学んでほしい。
Python環境は以下。
- Python 3.10.8
- plotly 5.11.0
- plotly-orca 3.4.2
参考になるサイト
Plotly公式
その他
- Plotly 複数のグラフを並べて表示 (make_subplots, set_subplots) | AIリサーチコレクション
- Python Plotly入門 – 複数のグラフをプロット | 楽しみながら理解するAI・機械学習入門
本記事のコード全文
下準備のimport
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
まずは下準備としてのimport
関連。本記事ではPlotly
のgo
でサブプロットを作成するのによく使われるmake_subplots
を使用するのでimport
。
その他はグラフ化するためのgoとグラフ保存用のpioをimportしている。goでグラフを作成する方法は以下からそれぞれの記事を確認できる。
go
のグラフの記事は例えば散布図(scatter plot)のgo.Scatter
や
-
【Plotlyで散布図】go.Scatterのグラフの描き方まとめ
これからPloltyで動くグラフを作りたい、もっとグラフをキ ...
続きを見る
Plotly
特有のグラフにボタンをつける方法を記事にしている。
-
【Plotly&ボタン】updatemenusとbuttonsでボタン機能を追加
Plotlyはプロットしたデータを動かすことができるのが大き ...
続きを見る
cols
指定でを横向きに左右に並べる
まずはサブプロットのグラフで複数のグラフを左右に並べる方法を紹介する。make_subplots
では以下の2ステップでサブプロットを作成できる。
make_subplots
の引数で行(rows
)と列(cols
)の数を指定fig.add_trace
でプロットを追加しつつrow
,col
を指定
2つのグラフを左右に並べる
2つのグラフを左右に並べる場合は行数が1で列数が2となる。なのでmake_subplots
もこれに沿うようにrows
とcols
の数値を指定。
fig
を作成できたらfig.add_trace
でグラフ化するプロットを追加する。それぞれのプロットをどこに配置するかを指定するには引数row
とcol
を使う。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 1×2のサブプロットを作成
fig = make_subplots(rows=1, cols=2)
fig.add_trace(
go.Scatter(x=[1, 2, 3], y=[4, 5, 6]),
row=1, col=1 # 行1・列1にグラフを配置
)
fig.add_trace(
go.Scatter(x=[20, 30, 40], y=[50, 60, 70]),
row=1, col=2 # 行1・列2にグラフを配置
)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_2graphs_lr"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
3つ以上のグラフを左右に並べる
3つ以上のグラフを並べる場合も同様にmake_subplots
でサブプロットの行数と列数を指定し、fig.add_trace
でプロットする位置を指定しながらプロットを追加する。
なお、make_subplots
で指定した列数にプロットを置かなかった場合、その領域にグラフが作成されることはない。上のグラフだと3列目にグラフを配置せずに空白にした。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 3つ以上のグラフを左右に並べる
# 1×4のサブプロットを作成
fig = make_subplots(rows=1, cols=4)
fig.add_trace(
go.Scatter(x=[1, 2, 3], y=[4, 5, 6]),
row=1, col=1 # 行1・列1にグラフを配置
)
fig.add_trace(
go.Scatter(x=[20, 30, 40], y=[50, 60, 70]),
row=1, col=2 # 行1・列2にグラフを配置
)
fig.add_trace(
go.Scatter(x=[300, 400, 500], y=[600, 700, 800]),
row=1, col=4 # 行1・列4にグラフを配置
)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_3graphs_lr"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
make_subplotsの列数とグラフの列数は合わせる
# 2つのグラフを左右に並べる
fig = make_subplots(rows=1, cols=2)
fig.add_trace(
go.Scatter(x=[300, 400, 500], y=[600, 700, 800]),
row=1, col=3
)
Exception: The (row, col) pair sent is out of range. Use Figure.print_grid to view the subplot grid.
ただし、make_subplots
で指定した行数・列数を超えた数値をfig.add_trace
で指定するとエラーになるので注意。
上の例では1行2列でサブプロットを作成したのに、3列目にグラフを置こうとしてエラーになった。
これは次に解説する上下に並べる時も同様だ。あくまでもmake_subplots
で指定した行数・列数を基準にプロットを追加する。
rows
指定で縦向きに上下に並べる
続いてはmake_subplots
で行数を増やすことで、複数のグラフを上下に並べる方法を解説する。
上下に並べる場合は左右に並べる方法とほぼ同様、cols
を複数にするかrows
を複数にするかの違いだけだ。
2つのグラフを上下に並べる
2つのグラフを上下に並べるにはmake_subplots
のrows=2
に設定する。そしてfig.add_trace
でプロットを追加する際に何行目に追加するのかを引数row
で指定する。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 2つのグラフを上下に並べる
# 2×1のサブプロットを作成
fig = make_subplots(rows=2, cols=1)
fig.add_trace(
go.Scatter(x=[1, 2, 3], y=[4, 5, 6]),
row=1, col=1 # 行1・列1にグラフを配置
)
fig.add_trace(
go.Scatter(x=[20, 30, 40], y=[50, 60, 70]),
row=2, col=1 # 行2・列1にグラフを配置
)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_2graphs_tb"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
3つ以上のグラフを上下に並べる
3つ以上のグラフでサブプロットを作成する場合も同様にmake_subplots
で行数を指定しfig.add_trace
でそれぞれのグラフの配置を決める。
また、グラフを配置しなかったサブプロットの位置は空白になる。上のグラフでは上から3番目の領域に何も配置しなかったので空白となっている。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 3つ以上のグラフを上下に並べる
# 4×1のサブプロットを作成
fig = make_subplots(rows=4, cols=1)
fig.add_trace(
go.Scatter(x=[1, 2, 3], y=[4, 5, 6]),
row=1, col=1 # 行1・列1にグラフを配置
)
fig.add_trace(
go.Scatter(x=[20, 30, 40], y=[50, 60, 70]),
row=2, col=1 # 行2・列1にグラフを配置
)
fig.add_trace(
go.Scatter(x=[300, 400, 500], y=[600, 700, 800]),
row=4, col=1 # 行4・列1にグラフを配置
)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_3graphs_tb"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
グリッド形式にグラフを並べる
左右・上下単体でサブプロットを応用するとサブプロットをグリッド状に配置することも可能だ。
特に2×2のグリッド状のグラフはよく目にするのでここで作成方法を理解してほしい。
make_subplotsで行数と列数を指定して作成
2×2のグリッド状のサブプロットの場合make_subplots
でrows=2, cols=2
と指定し、あとは最低4つのグラフをそれぞれの領域に配置するだけだ。
上のグラフでhmake_subplots
の引数start_cell="bottom-left"
とすることでサブプロットの初めのプロット位置を左上から左下に変更している。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 2×2のグラフを作成
fig = make_subplots(rows=2, cols=2, start_cell="bottom-left")
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]), row=1, col=1)
fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70]), row=1, col=2)
fig.add_trace(go.Scatter(x=[300, 400, 500], y=[600, 700, 800]), row=2, col=1)
fig.add_trace(go.Scatter(x=[4000, 5000, 6000], y=[7000, 8000, 9000]), row=2, col=2)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_grid"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
列の結合をしたグラフを作成
サブプロット内の全てのグラフの形状が同じではない場合もある。例えば上のグラフでは下段のグラフのサイズが1×2の横長だ。
このようにグラフを結合するにはmake_subplots
の引数specs
で結合するプロットの設定が必要だ。
上のグラフでは下段の緑のグラフを1×2にしたいので{"colspan": 2}
で2列を結合するように設定。
# colspanでグラフの結合
fig = make_subplots(
rows=2, cols=2,
specs=[
[{}, {}],
[{"colspan": 2}, None]
]
)
結合しないプロットは{}
で何もしないことを指定し、結合によりプロットできなくなった領域はNone
を指定する。
もちろん引数specs
を工夫することで、縦に長いグラフを作成することも可能だ。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 列を結合したグラフを作成
# colspanでグラフの結合
fig = make_subplots(
rows=2, cols=2,
specs=[
[{}, {}],
[{"colspan": 2}, None]
]
)
fig.add_trace(go.Scatter(x=[1, 2], y=[1, 2]), row=1, col=1)
fig.add_trace(go.Scatter(x=[1, 2], y=[1, 2]), row=1, col=2)
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[2, 1, 2]), row=2, col=1)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_grid_colspan"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
サブプロットのレイアウトをカスタム
ここまでで左右・上下・グリッド状にグラフをサブプロット形式で作成したが、まだグラフタイトルや軸ラベルを追加していない。
以下よりサブプロットのグラフのレイアウトをカスタムする方法を紹介する。
サブプロットにグラフタイトルをつける
まずはサブプロットのグラフ自体にタイトルをつける方法だ。サブプロットは複数のグラフが集まっているが、大きく見れば1つのグラフに過ぎない。
なので、通常のPlotly
のグラフタイトルをつける時と同様にfig.update_layout
でタイトルをつければ良い。
横軸・縦軸ラベルも同様の方法でつけることが可能だが、この場合は一番初めのプロット(xaxis1
, yaxis1
)に軸ラベルが付くことに注意。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# サブプロットにグラフタイトルをつける
fig = make_subplots(rows=1, cols=2)
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]), row=1, col=1)
fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70]), row=1, col=2)
# サブプロットのグラフタイトルと軸ラベル
fig.update_layout(
title_text="Subplot Title",
xaxis_title="x axis",
yaxis_title="y axis",
)
# 軸ラベルはxaxis1とyaxis1についていることに注意
print(fig)
# Figure({
# 'data': [{'type': 'scatter', 'x': [1, 2, 3], 'xaxis': 'x', 'y': [4, 5, 6], 'yaxis': 'y'},
# {'type': 'scatter', 'x': [20, 30, 40], 'xaxis': 'x2', 'y': [50, 60, 70], 'yaxis': 'y2'}],
# 'layout': {'template': '...',
# 'title': {'text': 'Subplot Title'},
# 'xaxis': {'anchor': 'y', 'domain': [0.0, 0.45], 'title': {'text': 'x axis'}},
# 'xaxis2': {'anchor': 'y2', 'domain': [0.55, 1.0]},
# 'yaxis': {'anchor': 'x', 'domain': [0.0, 1.0], 'title': {'text': 'y axis'}},
# 'yaxis2': {'anchor': 'x2', 'domain': [0.0, 1.0]}}
# })
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_2graphs_title"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
それぞれのグラフにタイトルをつける
それぞれのサブプロットにタイトルをつける場合はmake_subplots
のsubplot_titles
で指定する必要があることに注意。
あくまでもサブプロットを作成しているのはmake_subplots
なので設定もmake_subplots
で行う。
なお、subplot_titles
に記載したが使用しなかったグラフタイトルは表示されない。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# それぞれのグラフにタイトルをつける
# subplot_titlesでそれぞれのグラフにタイトルをつける
# 余ったタイトルは使用されない
fig = make_subplots(
rows=1, cols=2,
subplot_titles=("Plot 1", "Plot 2", "Plot 3", "Plot 4")
)
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]), row=1, col=1)
fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70]), row=1, col=2)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_2graphs_subplot_titles"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
それぞれのグラフに軸ラベルをつける
続いてはそれぞれのグラフに軸ラベルをつける方法だが、こちらは2種類の方法がある。
fig.update_xaxes
で行・列を指定fig.update_layout
で軸を指定
fig.update_xaxes
ではrow
, col
で行と列を指定することでどこに軸ラベルを追加するかを指定できる。
一方で、fig.update_layout
ではyaxis1
のように数字を指定することで直接、軸ラベルを追加することができる。
以下のコードでわかるように、x軸ラベルはfig.update_xaxes
で、y軸ラベルはfig.update_layout
で指定し
た。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# それぞれのグラフに軸ラベルをつける
fig = make_subplots(rows=1, cols=2)
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]), row=1, col=1)
fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70]), row=1, col=2)
# update_xaxesとrow・colの指定で変更することが可能
fig.update_xaxes(title_text="xaxis 1 title", row=1, col=1)
fig.update_xaxes(title_text="xaxis 2 title", row=1, col=2)
# axisと数字で変更することも可能
fig.update_layout(
yaxis1_title='yaxis 1 title',
yaxis2_title='yaxis 2 title',
)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_2graphs_axis_title"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig
プロット点に注釈をつける
各プロット点に注釈をつけるにはgo.Scatter
の引数text
が便利。詳しくは以下のgo.Scatterの記事で解説している。
-
【Plotlyで散布図】go.Scatterのグラフの描き方まとめ
これからPloltyで動くグラフを作りたい、もっとグラフをキ ...
続きを見る
引数modeでテキストを使用可能にすることでプロットにテキストを追加することができる。
上のサブプロットでは左のグラフにテキストを、右のグラフでyの値を表示した。プロットの値を表示するにはあらかじめプロットの値を変数に入れる必要があるので注意。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# プロット点に注釈をつける
fig = make_subplots(rows=1, cols=2)
fig.add_trace(
go.Scatter(
x=[1, 2, 3], y=[4, 5, 6],
mode="markers+text", # プロットのモードをマーカーとテキストにする
text=["Text A", "Text B", "Text C"], # 表示したい注釈を記載
),
row=1, col=1
)
y = [50, 60, 70]
fig.add_trace(
go.Scatter(
x=[20, 30, 40], y=y,
mode="markers+text", # プロットのモードをマーカーとテキストにする
text=y, # 表示したい注釈を記載
),
row=1, col=2
)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_2graphs_text"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
プロットの範囲やグリッドの表示を変更
サブプロットでは複数のグラフを表示できるが、それぞれのグラフに対して別々でレイアウトを変更することが可能だ。
上のサブプロットでは、左右のグラフでそれぞれ別のレイアウト変更を行った。
- 左のグラフ
- 横軸の範囲を
0~8
に指定 - 縦軸をlog形式で表示
- 横軸の範囲を
- 右のグラフ
- 横軸のグリッドを非表示
- 縦軸のグリッドをオレンジの点線に変更
もちろん他にも色々とカスタムすることができるので、Plotly公式のレイアウトのページから探ってほしい。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# プロット範囲やグリッドの表示を変更
fig = make_subplots(rows=1, cols=2)
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]), row=1, col=1)
fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70]), row=1, col=2)
fig.update_layout(
xaxis=dict(range=(0, 8)),
xaxis2=dict(showgrid=False),
yaxis=dict(type="log"),
yaxis2=dict(gridcolor="orange", griddash="dot"),
)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_2graphs_axis_custom"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
サブプロットの列の幅と行の高さを変更
サブプロット内のそれぞれのグラフの幅や高さを変更することも可能だ。上のグラフでは7:3の比率になるように調節した。
make_subplots
の引数column_widths
を指定することで列の幅を、row_heights
を指定することで行の高さを変更できる。
なお、合計値が1
にならなくても初めの値を基準に残りの値が自動で調節される。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# プロット範囲やグリッドの表示を変更
fig = make_subplots(rows=1, cols=2, column_widths=[0.7, 0.3])
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]), row=1, col=1)
fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70]), row=1, col=2)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_2graphs_column_widths"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
x軸・y軸を共有するサブプロット
サブプロットの内のグラフで横軸・縦軸を共有することが可能だ。make_subplots
の引数shared_xaxes
で横軸を、shared_yaxes
で縦軸を共有するか否かを決められる。
上のグラフではshared_yaxes=True
として縦軸だけ共有した。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 共通の軸を持つサブプロット
# shared_yaxesで軸を共有する設定をする
fig = make_subplots(rows=2, cols=2, shared_yaxes=True)
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]), row=1, col=1)
fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70]), row=1, col=2)
fig.add_trace(go.Scatter(x=[300, 400, 500], y=[600, 700, 800]), row=2, col=1)
fig.add_trace(go.Scatter(x=[4000, 5000, 6000], y=[7000, 8000, 9000]), row=2, col=2)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_grid_shared_yaxes"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
go
とlayout
のdomain
でサブプロット
ここまでmake_subplots
を使用してサブプロッtを作成する方法を解説したが、goを使ってもサブプロットを作成できる。
make_subplots
のように短いコードで作成はできないが、その分、自分が作成したいようにカスタムすることが可能だ。
手順は以下の2ステップで可能だ。
go.Scatter
などの引数xaxis
,yaxis
で軸を決めるgo.Layout
の各軸の設定の引数domain
でグラフの位置を決める
2つのグラフをdomain
で左右に並べる
go
でサブプロットを作成するにはgo
のプロットの引数xaxis
, yaxis
でどの軸に対してプロットするのか指定する。
上のサブプロットでは右のグラフをxaxis=”x2”
、yaxis="y2"
と指定しxaxis2
でグラフを作成する位置を指定した。また、y2
軸の基準はx2
にして独立させた。
左のグラフのdomain=[0, 0.7]
はx=0~0.7
の範囲でグラフ作成、右のグラフのdomain=[0.8, 1]
はx=0.8~1.0
の間でグラフを作成するという意味だ。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 2つのグラフをdomainで左右に並べる
trace1 = go.Scatter(x=[1, 2, 3], y=[4, 5, 6])
# 2つ目のグラフの基準はx2とy2に指定
trace2 = go.Scatter(x=[20, 30, 40], y=[50, 60, 70], xaxis="x2", yaxis="y2")
data = [trace1, trace2]
# domainでグラフの開始位置を指定
layout = go.Layout(
xaxis=dict(domain=[0, 0.7]),
xaxis2=dict(domain=[0.8, 1]),
yaxis2=dict(anchor="x2") # y2の基準はx2に指定
)
fig = go.Figure(data=data, layout=layout)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_domain_lr"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
2つのグラフをdomain
で上下に並べる
グラフを上下に分割するときも同様にdomain
の値を調節することでサブプロットを作成することができる。
ここではy=0~0.7
を下のグラフ、y=0.8~1.0
を上のグラフとして設定した。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 2つのグラフをdomainで上下に並べる
trace1 = go.Scatter(x=[1, 2, 3], y=[4, 5, 6])
# 2つ目のグラフの基準はx2とy2に指定
trace2 = go.Scatter(x=[20, 30, 40], y=[50, 60, 70], xaxis="x2", yaxis="y2")
data = [trace1, trace2]
# domainでグラフの開始位置を指定
layout = go.Layout(
xaxis2=dict(anchor="y2"), # x2の基準はy2に指定
yaxis=dict(domain=[0, 0.7]),
yaxis2=dict(domain=[0.8, 1])
)
fig = go.Figure(data=data, layout=layout)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_domain_tb"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
グリッド形式にグラフを並べる
グリッド状に配置する場合はそれぞれの軸の開始位置を把握することが重要だ。上の例では左下から右下、右上、左上の順番にプロットした。
この順番に応じてdomain
を設定する必要がある。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 4つのグラフをdomainでグリッドで並べる
trace1 = go.Scatter(x=[1, 2, 3], y=[4, 5, 6])
trace2 = go.Scatter(x=[20, 30, 40], y=[50, 60, 70], xaxis="x2", yaxis="y2")
trace3 = go.Scatter(x=[300, 400, 500], y=[600, 700, 800], xaxis="x3", yaxis="y3")
trace4 = go.Scatter(x=[4000, 5000, 6000], y=[7000, 8000, 9000], xaxis="x4", yaxis="y4")
data = [trace1, trace2, trace3, trace4]
layout = go.Layout(
# 右に配置するのはx2, x4
xaxis=dict(domain=[0, 0.45]),
xaxis2=dict(domain=[0.55, 1], anchor="y2"),
xaxis3=dict(domain=[0, 0.45], anchor="y3"),
xaxis4=dict(domain=[0.55, 1], anchor="y4"),
# 上に配置するのはy3, y4
yaxis=dict(domain=[0, 0.45]),
yaxis2=dict(domain=[0, 0.45], anchor="x2"),
yaxis3=dict(domain=[0.55, 1], anchor="x3"),
yaxis4=dict(domain=[0.55, 1], anchor="x4")
)
fig = go.Figure(data=data, layout=layout)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_domain_grid"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
domain
でx軸を共有して積み重ねる
domain
を使用した場合も軸を共有することが可能だ。それぞれのプロットで引数yaxis
だけ指定し、xaxis
を指定しなかった場合は横軸を共有することができる。
なお、上のグラフではそれぞれのグラフのdomain
をつなげるように指定したので、グラフの枠線が消えている。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# domainでx軸を共有
# x軸は共通、y軸はそれぞれのグラフで別にする
trace1 = go.Scatter(x=[0, 1, 2], y=[10, 11, 12])
trace2 = go.Scatter(x=[2, 3, 4], y=[100, 110, 120], yaxis="y2")
trace3 = go.Scatter(x=[3, 4, 5], y=[1000, 1100, 1200], yaxis="y3")
data = [trace1, trace2, trace3]
layout = go.Layout(
legend=dict(traceorder="reversed"), # 凡例の並びをプロットに合わせる
# domainの値をつなげるとグラフの枠が消える
yaxis=dict(domain=[0, 0.33]),
yaxis2=dict(domain=[0.33, 0.66]),
yaxis3=dict(domain=[0.66, 1])
)
fig = go.Figure(data=data, layout=layout)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_domain_share_yaxis"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
set_subplots
で既存のグラフにサブプロットを追加
最後に既存のfig
をサブプロット化できるfig.set_subplots
を紹介する。fig.set_subplots
はPlotly
のバージョン4.13
から追加されたサブプロットの作成方法だ。
fig.add_traces
からサブプロットを作成
まずは先にfig
を作成し、このfig
にfig.add_traces
でプロットを追加してからサブプロットを作成する方法を解説。
サブプロットでx2
, y2
以降の軸でグラフ化したいプロットでxaxis
, yaxis
を指定しfig
を作成、最後にfig.set_subplots
でサブプロットの設定をすると簡単に作成できる。
なお、サブプロットの各グラフの間隔はhorizontal_spacing
で指定可能だ。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# 先にfigを作成
fig = go.Figure()
fig.add_traces((
go.Scatter(x=[1, 2, 3], y=[4, 5, 6]),
go.Scatter(x=[20, 30, 40], y=[50, 60, 70], xaxis="x2", yaxis="y2")
))
print(fig)
# Figure({
# 'data': [{'type': 'scatter', 'x': [1, 2, 3], 'y': [4, 5, 6]},
# {'type': 'scatter', 'x': [20, 30, 40], 'xaxis': 'x2', 'y': [50, 60, 70], 'yaxis': 'y2'}],
# 'layout': {'template': '...'}
# })
# 後からサブプロットの設定
fig.set_subplots(1, 2, horizontal_spacing=0.1)
print(fig)
# Figure({
# 'data': [{'type': 'scatter', 'x': [1, 2, 3], 'y': [4, 5, 6]},
# {'type': 'scatter', 'x': [20, 30, 40], 'xaxis': 'x2', 'y': [50, 60, 70], 'yaxis': 'y2'}],
# 'layout': {'template': '...',
# 'xaxis': {'anchor': 'y', 'domain': [0.0, 0.45]},
# 'xaxis2': {'anchor': 'y2', 'domain': [0.55, 1.0]},
# 'yaxis': {'anchor': 'x', 'domain': [0.0, 1.0]},
# 'yaxis2': {'anchor': 'x2', 'domain': [0.0, 1.0]}}
# })
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_domain_set_subplots"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
trace
をdata
で入れてからサブプロット作成
また、あらかじめプロットを作成し、go.Figure
の引数data
に直接入れてからサブプロットを作成することも可能だ。
先ほどのfig.add_traces
とやっていることは同じなので結果も同じなる。
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
# traceをdataで入れてからサブプロット作成
trace1 = go.Scatter(x=[1, 2, 3], y=[4, 5, 6])
trace2 = go.Scatter(x=[20, 30, 40], y=[50, 60, 70], xaxis="x2", yaxis="y2")
data = [trace1, trace2]
fig = go.Figure(data=data)
# 後からサブプロットの設定
fig.set_subplots(1, 2, horizontal_spacing=0.1)
# グラフ全体とホバーのフォントサイズ変更
fig.update_layout(font_size=20, hoverlabel_font_size=20)
fig.show()
# グラフ保存
prefix = 'go-make-subplots' # 保存ファイル名の接頭辞
save_name = f"{prefix}_domain_set_subplots_data"
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html")
pio.write_image(fig, f"{save_name}.png")
複数のグラフを同時に動かせるようにする
今回はPlotly
のmake_subplots
を中心にサブプロットのグラフを作成する方法を解説した。複数のグラフを動かしながら比較できるのでぜひマスターしてほしい。
サブプロット以外にもPlotly
のグラフにupdatemenus
でボタンを追加する記事や
-
【Plotly&ボタン】updatemenusとbuttonsでボタン機能を追加
Plotlyはプロットしたデータを動かすことができるのが大き ...
続きを見る
-
【Plotly&ボタン】updatemenusのargs2で2回目のボタン押下機能を追加
今回はPlotlyのボタン機能に2回目のボタン押下の処理を追加& ...
続きを見る
グラフにsliders
でスライダー機能を追加する記事もある。どれもPlotly
特有のインタラクティブなグラフだ。
-
【Plotly&sliders】スライダーを追加しデータを切り変える
本記事ではPlotlyでデータの流れを簡単に理解できる機能の ...
続きを見る
より便利にPlotly
を使いたい人は併せて学んでほしい。