2016-06-28 9 views
9

Chciałbym z następującego kodu, że gdy użytkownik kliknie wiersz z datatable, a następnie na zdarzenie call back chciałbym wykreślić inne dane na temat daty.Wykreślanie wykresu on_click Wybieranie wierszy daty w pythonu bokeh 2.7

from datetime import date 
from random import randint 
from bokeh.models import ColumnDataSource 
from bokeh.models.widgets 
import DataTable, DateFormatter, TableColumn 
from bokeh.io import output_file, show, vform 

output_file("data_table.html") 

data = dict(
     dates=[date(2014, 3, i+1) for i in range(10)], 
     downloads=[randint(0, 100) for i in range(10)], 
    ) 
source = ColumnDataSource(data) 

columns = [ 
     TableColumn(field="dates", title="Date", formatter=DateFormatter()), 
     TableColumn(field="downloads", title="Downloads"), 
    ] 

data_table = DataTable(source=source, columns=columns, width=400, height=280) 

show(vform(data_table)) 

Zasadniczo, po kliknięciu na wiersz z data_table, chcę, aby wyświetlić wykres odpowiadający pierwszej nazwy kolumny (w tym dniu wypadku)

Jestem całkiem nowy, bokeh, więc nie do końca rozumiem, gdzie znajduje się detektor zdarzeń dla parametru on_click w module datatable.

Każda pomoc będzie mile widziane dzięki ..

Odpowiedz

0

Działa to w bokeh-server (0.12.3) APP:

from datetime import date 
from random import randint 
from bokeh.models import ColumnDataSource 
from bokeh.models.widgets import DataTable, DateFormatter, TableColumn 

import bokeh.layouts as layouts 
import bokeh.models.widgets as widgets 
from bokeh.io import curdoc 

from bokeh.charts import Line 
import numpy as np 

data = dict(
    dates=[date(2014, 3, i + 1) for i in range(10)], 
    downloads=[randint(0, 100) for i in range(10)], 
) 
d_source = ColumnDataSource(data) 

columns = [ 
    TableColumn(field="dates", title="Date", formatter=DateFormatter()), 
    TableColumn(field="downloads", title="Downloads"), 
] 

data_table = DataTable(source=d_source, columns=columns, width=400, height=280) 
data_table.row_headers = False 


def table_select_callback(attr, old, new): 
    selected_row = new['1d']['indices'][0] 
    download_count = data['downloads'][selected_row] 
    chart_data = np.random.uniform(0, 100, size=download_count) 
    fig = Line(chart_data, height=250, width=600) 
    fig.title.text = "Download times - {}".format(data['dates'][selected_row]) 
    root_layout.children[1] = fig 


d_source.on_change('selected', table_select_callback) 

root_layout = layouts.Column(data_table, widgets.Div(text='Select Date')) 
curdoc().add_root(root_layout) 

Uwaga: możliwe jest użycie innego ColumnDataSource na wykresie liniowym i pchania zmian to. W ten sposób możesz uniknąć pełnego przerysowania kliknięcia, co prowadzi do lepszego UX.

enter image description here

Powiązane problemy