当用户点击DataTable时,Bokeh图被取消激活,并且没有正确的方法来激活图

时间:2017-12-06 11:50:02

标签: python bokeh

当我在我的散景应用程序中使用DataTable时,每当我在数据表中单击时,我页面上的绘图都会变为decativated。这种情况发生在editable=Trueeditable=False

我发现再次激活情节的唯一方法是点击"重置"工具按钮。

问题:

  • 我在Bokeh应用程序中做错了什么?
  • 有没有其他人遇到过此问题,并找到了解决方法? (也许是Javascript解决方法?)

屏幕截图(注意图中停用的颜色):

enter image description here

完整的散景应用程序位于下方,使用bokeh serve --show filename.py

运行
from datetime import datetime, timedelta

import numpy as np
import pandas as pd
import bokeh
from bokeh.layouts import widgetbox, row, layout
from bokeh.models import ColumnDataSource, Button, DataTable, TableColumn, Paragraph
from bokeh.models.widgets.tables import DateFormatter, StringEditor
from bokeh.plotting import curdoc, figure


def create_dataframe(number_of_series, number_of_values):
    t0 = datetime(2017, 1, 1)
    data = {
        "timestamp": [t0 + (i * timedelta(seconds=3600*2)) for i in range(number_of_values)]
    }
    data.update({
        "col{}".format(i): np.random.rand(number_of_values)
        for i in range(number_of_series)
    })
    return pd.DataFrame(data).set_index("timestamp")


source = ColumnDataSource(create_dataframe(10, 1000))


btn = Button(label="Click Me")


my_figure = figure(x_axis_type="datetime")
my_figure.line(y="col0", x="timestamp", source=source)

data_table = DataTable(editable=True, source=source, columns=[
    TableColumn(title="Timestamp", field="timestamp", formatter=DateFormatter(format="%Y-%m-%d %H:%M:%S"), editor=StringEditor()),
    TableColumn(title="col0", field="col0")
])

page_layout = layout([
    [widgetbox(Paragraph(text="Bokeh version: {}".format(bokeh.__version__)))],
    [widgetbox(btn), my_figure],
    [data_table]
])

curdoc().add_root(page_layout)

1 个答案:

答案 0 :(得分:2)

这实际上是使用散景ColumnDataSource背后的预期行为。当您在表中选择一行时,该行将在数据源中选择属性。见https://bokeh.pydata.org/en/latest/docs/user_guide/data.html#columndatasource

你最初没有注意到这一点,因为图上有大量的数据点 - 选择时任何一个都不可见。尝试移动点击并选择多行,你会看到图表的片段变成深蓝色 - 相应的到那些行。

防止此行为的最简单方法是使用单独的数据源。

如果您希望它们相同,则每次更新时都必须恢复source.selected字典,这似乎毫无意义。

from datetime import datetime, timedelta

import numpy as np
import pandas as pd
import bokeh
from bokeh.layouts import widgetbox, row, layout
from bokeh.models import ColumnDataSource, Button, DataTable, TableColumn, Paragraph
from bokeh.models.widgets.tables import DateFormatter, StringEditor
from bokeh.plotting import curdoc, figure


def create_dataframe(number_of_series, number_of_values):
    t0 = datetime(2017, 1, 1)
    data = {
        "timestamp": [t0 + (i * timedelta(seconds=3600*2)) for i in range(number_of_values)]
    }
    data.update({
        "col{}".format(i): np.random.rand(number_of_values)
        for i in range(number_of_series)
    })
    return pd.DataFrame(data).set_index("timestamp")


source = ColumnDataSource(create_dataframe(10, 1000))

sourcetable = ColumnDataSource(create_dataframe(10, 1000))

btn = Button(label="Click Me")


my_figure = figure(x_axis_type="datetime")
my_figure.line(y="col0", x="timestamp", source=source)

data_table = DataTable(editable=True, reorderable=False, source=sourcetable, columns=[
    TableColumn(title="Timestamp", field="timestamp", formatter=DateFormatter(format="%Y-%m-%d %H:%M:%S"), editor=StringEditor()),
    TableColumn(title="col0", field="col0")
])

page_layout = layout([
    [widgetbox(Paragraph(text="Bokeh version: {}".format(bokeh.__version__)))],
    [widgetbox(btn), my_figure],
    [data_table]
])

curdoc().add_root(page_layout)