如何使Bokeh Datatable响应

问题描述 投票:0回答:1

我试图使我的数据表适合全宽,但我正在努力实现这一目标。

我想避免给表固定。

这是表的代码。我正在使用get_table函数生成它,使用componnets_web函数来获取div和script标记。然后使用bokeh.layouts.layout在其他地方显示它。

def get_table(self):
    '''
    creates a bokeh table widget from provided dataframe.
    :param dataframe: A pandas dataframe
    :return: data_table: A Bokeh widget
    '''

    from bokeh.models.widgets import DataTable, TableColumn

    source = ColumnDataSource(self.dataframe)
    columns = [TableColumn(field=f, title=f) for f in self.headers]
    data_table = DataTable(source=source, columns=columns)

    return data_table

def components_web(plot):
    '''
    Generates html components for web display.
    :param plot: A bokeh plot
    :return: script: A html <script> tag with render javascript, div a <div> tag with html to display a bokeh plot,
    resources: A <script> tag with javascript to render bokeh plots.
    '''

    from bokeh.resources import CDN
    from bokeh.embed import components

    script, div = components(plot, CDN)

    return script, div

然后实际显示它并获得布局:

    table = br.get_table()
    script, div = br.components_web(layout([table], sizing_mode='stretch_both'))
    resource = br.bokeh_web_resources()

关于如何解决这个问题的任何想法?

python bokeh
1个回答
0
投票

您可以尝试通过检查浏览器中的Bokeh表css类来覆盖Bokeh CSS样式,并创建自己的具有不同宽度属性的类,而不是将其放在外部style.css文件中,并通过将css_classes = ["my_class"]属性添加到TableColumn来引用它。数据表。然而,这可能非常困难,因为有许多类,并且您不确切地知道要定位哪些类。

相反,我建议使用以下解决方案,您可以允许用户使用滑块设置自定义表格宽度。同样的想法也可以应用于桌子高度。

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

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

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

table = DataTable(source = source, columns = columns, width = 300, css_classes = ['my_class'])
slider = Slider(start = 1, end = 200, value = 15, step = 1, title = "i", width = 300)

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

slider.on_change('value', update_data)

layout = widgetbox(slider, table)
curdoc().add_root(layout)
© www.soinside.com 2019 - 2024. All rights reserved.