Python3: обновление таблицы данных Bokeh из нового источника данных - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь написать приложение bokeh, в котором источник данных для DataTable выбирается нажатием на точку в мапплоте. Функция обратного вызова этого сопоставления выбирает данные, которые затем должны быть нанесены на график в DataTable.

Я назначаю DataTable «фиктивные данные» для правильного отображения. После нажатия на точку (станцию) функция обратного вызова mapplot должна обновить источник данных таблицы, чтобы отобразились выбранные данные. Но я борюсь с обновлением источника данных таблицы, там только одна строка обновлена ​​/ отображается.

Вот несколько упрощенных кодов из моего приложения:

from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
from bokeh.events import Tap
from bokeh.models import TapTool, DateFormatter
from bokeh.tile_providers import get_provider, Vendors
from bokeh.models.widgets import DataTable, TableColumn
from bokeh.layouts import layout, row
from bokeh.io import curdoc

def callback(event):
    """
    Callback function for tap event in mapplot
    """
    # change data for table
    df = ColumnDataSource(data=dict(index=[50000000,55000000,60000000], LT=[13.5,20.2,-3.1])) 
    data_table.source = df


dfm = ColumnDataSource(data=dict(x=[1196199], y=[5907860])) # samplestation for mapplot
df = ColumnDataSource(data=dict(index=[0], LT=['NaN'])) # initial data for datatable

#### Mapplot
tile_provider = get_provider(Vendors.CARTODBPOSITRON)
tools_to_show_p1 = 'box_zoom,pan,save,reset,tap,wheel_zoom'
p1 = figure(x_range=(1043319, 1471393), y_range=(5684768, 6176606),
           x_axis_type="mercator", y_axis_type="mercator", 
           tools=tools_to_show_p1, sizing_mode="scale_both")
p1.add_tile(tile_provider)
p1.circle(x="x", y="y", size=15, fill_color="blue", fill_alpha=0.4, source=dfm)


#### Datatable

datefmt = DateFormatter(format="%m/%d/%Y %H:%M:%S")
columns = [
       TableColumn(field="index", title="date", formatter=datefmt),
       TableColumn(field="LT", title="LT"),
    ]
data_table = DataTable(source=df, columns=columns, width=300, height=600, fit_columns=True, editable=True)

#### Events
taptool = p1.select(type=TapTool)
p1.on_event(Tap, callback)

doc_layout = layout(children=[row(p1, data_table)], sizing_mode='fixed')
curdoc().add_root(doc_layout)

Примечание: вы не можете запустить это в блокноте jupyter, его нужно запустить как bokeh serve xxx.py --show

Как мне обновить DataTable для отображения всех данных?

(Пожалуйста, не используйте функции JsCallback, поскольку у меня другая логика, как выполняется весь обратный вызов, это просто упрощенный пример)

1 Ответ

1 голос
/ 19 октября 2019

Вы не должны заменять ColumnDataSource. Вместо этого вам следует обновить CDS, присвоив его .data свойству:

data_table.source.data = new_data

Обратите внимание, что .data должна обычно быть простым Python dict . Вы можете использовать ColumnDataSource.from_df(...) для преобразования DatFrame в ожидаемый формат. В будущих версиях такого рода вещи будут выдавать явные ошибки.

...