【问题标题】:Bokeh chart with slider and checkbox?带有滑块和复选框的散景图?
【发布时间】:2019-03-13 21:38:22
【问题描述】:

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

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

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

我可以绘制的散景图:

有人可以帮我解决这个问题吗?

【问题讨论】:

  • by Jqurey 你是说 jQuery 吗?
  • 我的坏@barbsan 但没有帮助......!!!

标签: python checkbox widget slider bokeh


【解决方案1】:

您可以使用交互式图例,而不是添加复选框。我在示例中添加了这个而不是复选框,节省了一些代码/空间。单击图例项时,线条应消失。我还添加了一个 DateRangeSlider。

由于我在此代码中使用回调函数,因此您必须将其作为散景服务器运行: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))

【讨论】:

  • 再提供一个帮助,因为您在这里使用了 curdoc()。我试图通过 show(layout = column(slider, p) 看到这个,它返回了这个错误"""RuntimeError: 模型必须只属于一个文档""" 如何简单地显示这个?
  • 您必须使用bokeh serve script.py --show 运行它,因为它使用on_change() 来检测更改。可以在没有散景服务器的情况下运行它,但是您必须将回调函数替换为 CustomJS
  • 还添加了悬停工具的代码。如果要显示更多信息,则必须使用 ColumnDataSource。更多关于 hovertools 的信息:bokeh.pydata.org/en/latest/docs/user_guide/tools.html#hovertool
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多