【plotly】rangeselectorでワンクリックで表示範囲を変更[Python]

  • URLをコピーしました!
目次

plotly

前回、plotlyでrangesliderで表示範囲をスライドして指定する方法を紹介しました。

今回は同じくplotlyで表示範囲をワンクリックで変更できるrangeselectorを紹介します。

このrangeselectorはX軸が日時の場合に使えるセレクタで、ボタンをクリックするだけで例えば1日、1週間、1ヶ月などの範囲を固定し表示してくれる機能です。

まず基本となるプログラムをこんな感じで作成してみました。

import plotly.graph_objects as go
import random
import datetime

initial_date = datetime.datetime.today()

date = []; y = []
[(date.append(initial_date + datetime.timedelta(days=i)), y.append(random.randint(0, 100))) for i in range(1000)]

graph = go.Scatter(x=date,y=y)

fig = go.Figure(data=graph)

with open('plotly-1.txt', 'w') as f:
     f.write(fig.to_html(include_plotlyjs='cdn',full_html=False))

実行結果

前回同様、1000個のデータをプロットするプログラムですが、X軸方向を日時にするため、X軸を「initial_date + datetime.timedelta(days=i)」として、1日1点のデータを作成しています。

前回同様、出力はテキストファイル(.txt)にしており、「full_html=False」としていますので、必要に応じて変更してください。

rangeselectorの基本

rangeselectorの基本としては、こんな感じで「fig.update_layout」のオプションに「rangeselector」を追加します。

fig.update_layout(xaxis=dict(rangeselector=dict(buttons=list([dict(label='1D', count=1, step='day')]))))

「xaxis=dict()」でX軸方向に、「rangeselector=dict()」でrangeselectorを追加、そして「buttons=list()」でrangeselector用のボタンを追加します。

さらにbottons=list()の中には辞書形式で「label」、「count」、「step」の3つを格納します。

labelはボタンに表示されるラベル、stepは単位(日や週、月など)、countは何step分を範囲とするか、つまり「stepを’day’」にして「countを3」とするとこのボタンを押した際の範囲は「3日」の範囲となります。

stepで指定できる単位は「year(年)」、「month(月)」、「day(日)」、「hour(時)」、「minute(分)」、「second(秒)」、「all(全て)」です。

それでは試してみましょう。

import plotly.graph_objects as go
import random
import datetime

initial_date = datetime.datetime.today()

date = []; y = []
[(date.append(initial_date + datetime.timedelta(days=i)), y.append(random.randint(0, 100))) for i in range(1000)]

graph = go.Scatter(x=date,y=y)

fig = go.Figure(data=graph)

fig.update_layout(xaxis=dict(rangeselector=dict(buttons=list([\
                    dict(label='1D', count=1, step='day')]))))

with open('plotly-2.txt', 'w') as f:
     f.write(fig.to_html(include_plotlyjs='cdn',full_html=False))

実行結果

左上に「1D」というボタンができています。

この「1D」のボタンをクリックすると、グラフの最後の1日分のデータが表示されます。

複数のrangeselectorを設定する方法

範囲を設定する場合、一つだけでは物足りない場合が多いでしょう。

その場合は「buttons=list()」の中にさらに追加したいセレクタを格納していきます。

import plotly.graph_objects as go
import random
import datetime

initial_date = datetime.datetime.today()

date = []; y = []
[(date.append(initial_date + datetime.timedelta(days=i)), y.append(random.randint(0, 100))) for i in range(1000)]

graph = go.Scatter(x=date,y=y)

fig = go.Figure(data=graph)

fig.update_layout(xaxis=dict(rangeselector=dict(buttons=list([\
                    dict(label='1D', count=1, step='day'),
                    dict(label='1W', count=7, step='day'),
                    dict(label='1M', count=1, step='month'),
                    dict(label='1Y', count=1, step='year'),
                    ]))))

with open('plotly-3.txt', 'w') as f:
     f.write(fig.to_html(include_plotlyjs='cdn',full_html=False))

これで各範囲をワンクリックで表示することができます。

rangesliderとrangeselectorを同時に使用

もし範囲を固定してグラフ表示を動かしたい場合は、前回紹介したrangesliderも設定します。

import plotly.graph_objects as go
import random
import datetime

initial_date = datetime.datetime.today()

date = []; y = []
[(date.append(initial_date + datetime.timedelta(days=i)), y.append(random.randint(0, 100))) for i in range(1000)]

graph = go.Scatter(x=date,y=y)

fig = go.Figure(data=graph)

fig.update_layout(xaxis=dict(rangeselector=dict(buttons=list([\
                    dict(label='1D', count=1, step='day'),
                    dict(label='1W', count=7, step='day'),
                    dict(label='1M', count=1, step='month'),
                    dict(label='1Y', count=1, step='year'),
                    ]))),\
                 xaxis_rangeslider=dict(visible=True), yaxis=dict(fixedrange=False))

with open('plotly-4.txt', 'w') as f:
     f.write(fig.to_html(include_plotlyjs='cdn',full_html=False))

実行結果

rangeselector用にたくさんのカッコがあるので、どのカッコ内にrangesliderを記載するのかを注意してください。

これでだいぶグラフの扱いが楽にできるかと思います。

次回はsqlite3でエスケープ処理に関して色々と試していきます。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次