Изменение количества строк таблицы Bokeh - PullRequest
0 голосов
/ 23 апреля 2019

Ниже приведен рабочий пример таблицы Боке, которая заполнена выборками из точечной диаграммы.

После первоначальной инициализации таблицы всегда отображается столько строк (слишком много или слишком мало).

Есть ли способ сделать число строк динамическим, чтобы соответствовать количеству выбранных записей?

Спасибо

import numpy as np
import pandas as pd
from bokeh.layouts import  row
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, curdoc, show
from bokeh.models.widgets import DataTable, DateFormatter, TableColumn


#Plotting points on chart.
initial_df = pd.DataFrame(np.random.randint(0,100,size=(500, 2)), 
                          columns=["X","Y"], 
                          index=[str(i) for i in range(1,500+1)])

pointchart=figure(plot_width=800, plot_height=700, 
                  tools=['lasso_select','box_select'],
                  title="Points for selection")

pointchart_source= ColumnDataSource(initial_df )
pointchart_glyph= pointchart.circle("X","Y",source=pointchart_source,size=3.5)


#Source for table
source_df=initial_df 
source_df['ID']=source_df.index

#Making initial table source from dataframe. The table will always have this number of rows.
initial_source_for_table = ColumnDataSource(source_df)

columns =  [TableColumn(field='ID', title="Col1"),
           TableColumn(field="X", title="Col2"), 
           TableColumn(field="Y", title="Col3")]

global data_table #lets you access it in the callback.
data_table = DataTable(source=initial_source_for_table, columns=columns, width=800, height=400)


def on_selection_change(attr, old, new):
    newdataframe= pd.DataFrame(pointchart_source.data).loc[new]
    newdataframe['ID']=newdataframe.index
    newsource=ColumnDataSource(newdataframe[['ID',"X","Y"]].dropna(how='all'))


    data_table.source=newsource
    data_table.width=500
    data_table.height=500


pointchart_glyph.data_source.selected.on_change('indices',on_selection_change) 


#Show
layout=row(pointchart,data_table)
curdoc().add_root(layout)
!powershell -command {'bokeh serve --show Test_Table.ipynb'}

1 Ответ

2 голосов
/ 24 апреля 2019

У меня нет ноутбука Jupyter, но этот пример должен помочь вам в пути.Просто посчитайте количество выбранных точек и измените количество строк таблицы с помощью table.height = number_points * 25.Запустите код с: bokeh serve --show app.py

from bokeh.io import curdoc, show
from bokeh.layouts import widgetbox
from bokeh.models import ColumnDataSource, Slider, DataTable, TableColumn

max_i = 200
init_i = 6

def get_square(n):
    return dict(x = list(range(n)), y = [x ** 2 for x in range(n)])

source = ColumnDataSource(get_square(init_i))
columns = [
    TableColumn(field = "x", title = "x"),
    TableColumn(field = "y", title = "x**2"),
]

table = DataTable(source = source, columns = columns, width = 320)
slider = Slider(start = 1, end = max_i, value = init_i, step = 1, title = "i", width = 300)

def update_data(attrname, old, new):
    i = slider.value
    table.source.data = get_square(i)
    table.height = i * 25 + 25
    table.update()

slider.on_change('value', update_data)

layout = widgetbox(slider, table)
curdoc().add_root(layout)

Кстати: вы не должны заменять весь ColumnDataSource в вашем обратном вызове, а просто назначить ему новые данные, как в моем примере, то есть использовать:

table.source.data = new_data 

вместо:

table.source = new_source
...