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でエスケープ処理に関して色々と試していきます。
ではでは今回はこんな感じで。
コメント