0
0

More than 1 year has passed since last update.

plotlyで複数のグラフに同じ図形を重ね書きする

Posted at

概要

plotly expressで描画した複数の散布図に、一括で境界線を重ね書きプロットする。

やりたいこと

こういうのをお手軽にプロットしたい
newplot.png

元のグラフ

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()

newplot.png

一括重ね書きするには

内部的には左右のグラフを描き分けるのに、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()

newplot.png

最後に

多分一年後くらいにグラフを描く自分へ。
AddPlotRect()を適当にコピペして色味だけ調整すれば、自分が必要なことはできるはず。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0