🐕

plotly 複数のグラフで共通のレンジスライダーを使う

2022/03/14に公開

【python】plotlyの使い方
複数の時系列データを扱っている時に、共通のレンジスライダーを使ってみたくなったことってありませんか?

もくじ

  1. 環境
  2. モジュールのインポートと分析するデータの読み込み
  3. 2つのデータを1つの表で表現する
  4. 複数の表でレンジスライダーを共有する

1.環境

anaconda
jupyterLab 32.9
データ:hitoe(TX02)から取得した心拍、湿度、体温のデータ(2回分を並べています。)を使っています。
デスクトップ上にtestフォルダを作りその中にtest.csvという名前で保存しています。
ユーザ:user1

2.モジュールのインポートと分析するデータの読み込み

# モジュールのインポート
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
import plotly.io as pio

# データの読み込み
in_file = "C:\\Users\\user1\\Desktop\\test\\test.csv" 
df = pd.read_csv(in_file)

df にうまくtest.csvが定義されたか確認

display(df)

こんなふうに出力されました。
今回使うデータは赤枠で囲った部分になります。

3.2つのデータを1つの表で表現する

心拍の2つのデータを1つの表で表現します。レンジスライダーもつけておきます。

fig = go.Figure()
name = "hr"
a1 = "first_" + name
a2 = "second_" + name
for i in [a1, a2]:
    fig.add_trace(go.Scatter(x=df['time'], y=df[i],
                        mode='lines', # 'lines' or 'markers'
                        name=i))
# fig.show()

# y軸の範囲設定を追加する
fig.update_yaxes(range=(60, 120))

# 凡例の位置を指定する
fig.update_layout(legend=dict(x=0.99,          # ①:X座標
                              y=0.99,          # ①:Y座標
                              xanchor='right',  # ②:X座標が凡例のどの部分を表すか
                              yanchor='top',   # ②:Y座標が凡例のどの部分を表すか
                              orientation='h', # ③:凡例を横並びにする
                              ))

# タイトルの大きさと位置を指定する。
fig.update_layout(title=dict(text="心拍",
                             font=dict(size=15,
                                       color='grey'),
                             y=0.88
                            )
                  )

# レンジスライダーを追加する
fig.update_layout(xaxis_rangeslider=dict(visible=True))

ファイルへの書き出しましょう。ブラウザ上にhtmlで表れます。

from plotly import offline
offline.plot(fig)


このデータは黄色い網掛け部分の場所に保存されています。

4.複数の表でレンジスライダーを共有する

同じスケールで比較したいですよね。最後にレンジスライダーを共有する方法を紹介します。
最初の方に定義するfig = make_subplotsがポイントです!

fig = go.Figure()

fig = make_subplots(
    rows=3, cols=1,
    subplot_titles=("心拍", "湿度", "体温"),
    row_heights=[0.4,0.3,0.3],
    shared_xaxes=True,
).update_layout(xaxis_rangeslider=dict(visible=True))

##############
# 心拍
name = "hr"
a1 = "first_" + name
a2 = "second_" + name
for i in [a1, a2]:
    fig.add_trace(go.Scatter(x=df['time'], y=df[i],
                        mode='lines', # 'lines' or 'markers'
                        name=i), row=1, col=1)
##############
# 湿度
name = "hum"
a1 = "first_" + name
a2 = "second_" + name
for i in [a1, a2]:
    fig.add_trace(go.Scatter(x=df['time'], y=df[i],
                        mode='lines', # 'lines' or 'markers'
                        name=i), row=2, col=1)
##############
# 体温
name = "tem"
a1 = "first_" + name
a2 = "second_" + name
for i in [a1, a2]:
    fig.add_trace(go.Scatter(x=df['time'], y=df[i],
                        mode='lines', # 'lines' or 'markers'
                        name=i), row=3, col=1)
##############
fig.show()

こんな感じになります。レンジスライダーの位置が少し気になりますが、変更する方法が分かれば教えて頂きたいです(。-_-。)。

Discussion