🐕
plotly 複数のグラフで共通のレンジスライダーを使う
複数の時系列データを扱っている時に、共通のレンジスライダーを使ってみたくなったことってありませんか?
【python】plotlyの使い方もくじ
- 環境
- モジュールのインポートと分析するデータの読み込み
- 2つのデータを1つの表で表現する
- 複数の表でレンジスライダーを共有する
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