Диаграмма Боке с ползунком и флажком? - PullRequest
0 голосов
/ 11 марта 2019

У меня есть данные в формате данного изображения.data format

Мне трудно добавить "Checkbox" для переменных и "Slider" для диапазона дат индекса.

Я много исследовал в StackOverflowно так как у меня нет знаний о jQuery или js, я не мог понять, что делать.

Мой код:

from bokeh.palettes import Spectral11
from bokeh.plotting import figure, show, output_file
from bokeh.models import Legend, LegendItem
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.models import CustomJS, Slider
from bokeh.layouts import row, widgetbox
from bokeh.models import CustomJS, Slider
from bokeh.plotting import figure, output_file, show, ColumnDataSource

output_file('temp.html')  
numlines=len(data.columns)
mypalette=Spectral11[0:numlines]
p = figure(width=1100, height=650, x_axis_type="datetime") 
r =p.multi_line(xs=[data.index.values]*numlines,
                ys=[data[name].values for name in data],
                line_color=mypalette,
                line_width=3)
legend = Legend(items=[
    LegendItem(label=f"{X_t_list[:1]}", renderers=[r], index=0),
    LegendItem(label=f"{X_t_list[1:2]}", renderers=[r], index=1),
    LegendItem(label=f"{X_t_list[2:3]}", renderers=[r], index=2),
    LegendItem(label=f"{X_t_list[3:4]}", renderers=[r], index=3),
    LegendItem(label=f"{X_t_list[4:5]}", renderers=[r], index=4),
    LegendItem(label=f"{X_t_list[5:6]}", renderers=[r], index=5),
    LegendItem(label=f"{X_t_list[6:7]}", renderers=[r], index=6),
    LegendItem(label=f"{X_t_list[7:8]}", renderers=[r], index=7),
    LegendItem(label=f"{X_t_list[8:9]}", renderers=[r], index=8),
    LegendItem(label=f"{X_t_list[9:10]}", renderers=[r], index=9),
    LegendItem(label=f"{X_t_list[10:11]}", renderers=[r], index=10),])
p.add_layout(legend)
show(p)

График Bokeh, я могу построить:

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 12 марта 2019

Вместо добавления флажков вы можете использовать интерактивную легенду. Я добавил это в своем примере вместо флажков, экономит некоторый код / ​​пространство. Линии должны исчезнуть при нажатии на элемент легенды. Я также добавил DateRangeSlider.

Поскольку в этом коде я использую функции обратного вызова, вам придется запускать его как сервер bokeh: bokeh serve script.py --show.

import pandas as pd
from bokeh.palettes import Spectral11
from bokeh.plotting import figure, show, curdoc
from bokeh.models.widgets import DateRangeSlider
from bokeh.layouts import layout

df = pd.read_csv('Data.csv')
df['Index'] = pd.to_datetime(df['Index'])

tooltips = [
    ("Value", "$y"),
    ("Variable", "$name")
]
p = figure(width=1100, height=650, x_axis_type="datetime", tooltips=tooltips) 

for column, color in zip(list(df)[1:], Spectral11):
    p.line(x=df['Index'], y=df[column], color=color, legend=column, line_width=3, name=column)

def updateRange(attr, old, new):
    p.x_range.start = new[0]
    p.x_range.end = new[1]

slider = DateRangeSlider(title="Period", start=min(df['Index']), end=max(df['Index']), value=(min(df['Index']),max(df['Index'])), width=500)
slider.on_change('value', updateRange)
p.legend.click_policy="hide"
curdoc().add_root(layout(slider,p))

enter image description here

...