2016-06-28 19 views
9

Ich möchte aus dem folgenden Code, wenn der Benutzer auf eine Zeile aus der Datentabelle klickt dann auf dem Rückruf-Ereignis möchte ich andere Daten über das Datum plotten.Zeichnen eines Graphen on_click Datatable Zeilenauswahl in Bokeh Python 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)) 

Grundsätzlich, wenn ich von der data_table auf eine Zeile klicken, möchte ich entsprechend dem ersten Spaltennamen einen Plot angezeigt werden (in diesem Fall Datum)

ich ziemlich neu bin auf Bokeh, so dass ich verstehe nicht ganz, wo der Ereignis-Listener für den on_click auf der Datentabelle ist.

Jede Hilfe dank würde geschätzt ..

Antwort

0

Dies funktioniert in 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) 

Hinweis: es möglich ist, eine andere ColumnDataSource für Liniendiagramm zu verwenden und drücken Änderungen es. Auf diese Weise können Sie ein vollständiges Neuzeichnen beim Klicken vermeiden, was zu einem besseren UX führt.

enter image description here