概要
plotly expressで描画した複数の散布図に、一括で境界線を重ね書きプロットする。
やりたいこと
元のグラフ
plotly expressのサンプルデータをplotly expressのfacet_colで横方向にプロットするだけ。
こんなグラフを描くと、両方のグラフにいわゆる欲しいデータの境界線を重ね書きしたくなってくる。
import plotly.graph_objects as go
import plotly.express as px
df = px.data.experiment()
fig = px.scatter(df, x="experiment_1", y="experiment_2",
facet_col='gender', color='group')
fig.show()
一括重ね書きするには
内部的には左右のグラフを描き分けるのに、rowとcolの指定が必要になる。
一々、rowとcolを調べて指定したくないので描画範囲を指定するだけで済むように関数化した。
rowとcolの上下限値を_get_subplot_rows_columns()で取得してforループでrowとcolを指定している。
import plotly.graph_objects as go
import plotly.express as px
df = px.data.experiment()
fig = px.scatter(df, x="experiment_1", y="experiment_2",
facet_col='gender', color='group')
def AddPlotRect(fig: go.Figure,
x_low: float, x_high: float,
y_low: float, y_high: float):
# _get_subplot_rows_columns()でrowとcolの範囲をタプルで取得
row_range, col_range = fig._get_subplot_rows_columns()
for row_index in row_range:
for col_index in col_range:
fig.add_shape(type="rect",
xref="x", yref="y",
x0=x_low, y0=y_low,
x1=x_high, y1=y_high,
line=dict(
dash='dash',
color='rgba(255,0, 0, 0.6)',
width=3,
),
fillcolor='rgba(255,128, 128, 0.1)',
row=row_index,
col=col_index
)
# figに重ね書きしたい矩形のxy座標2点を指定
AddPlotRect(fig, 90, 110, 100, 130)
fig.show()
最後に
多分一年後くらいにグラフを描く自分へ。
AddPlotRect()を適当にコピペして色味だけ調整すれば、自分が必要なことはできるはず。