带有滑块和复选框的散景图?

时间:2019-03-11 12:46:13

标签: python checkbox widget slider bokeh

我有给定图像格式的数据。 data format

我发现很难为索引日期范围添加变量的“复选框”和“滑块”。

我已经通过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)

我可以绘制的散景图:

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

您可以使用交互式图例来代替添加复选框。我在示例中添加了此内容而不是复选框,从而节省了一些代码/空间。单击图例项时,行应消失。我还添加了一个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