Reputation: 225
The example code I am pasting is taken from the following link.
layout for multiple Data Table as children in each Bokeh Tab
from bokeh.models.widgets import Panel, Tabs, TableColumn,DataTable, Div
import numpy as np
from bokeh.io import output_notebook, show
from bokeh.models import ColumnDataSource
from bokeh.layouts import row, column, layout
from bokeh.layouts import row, column, Spacer
output_notebook()
columns = [
TableColumn(field="A", title="A"),
TableColumn(field="B", title="B"),
TableColumn(field="C", title="C"),
TableColumn(field="D", title="D"),]
data1 = {"A":np.random.randint(23, 89, 10),
"B": np.random.randint(23, 89, 10),
"C": np.random.randint(23, 89, 10),
"D": np.random.randint(23, 89, 10)}
source1 = ColumnDataSource(data1)
p1 = DataTable(source=source1, columns=columns, width=300, height=200,editable=True)
data2 = {"A":np.random.randint(23, 89, 10),
"B": np.random.randint(23, 89, 10),
"C": np.random.randint(23, 89, 10),
"D": np.random.randint(23, 89, 10)}
source2 = ColumnDataSource(data2)
p2 = DataTable(source=source2, columns=columns, width=300, height=200,editable=True)
data3 = {"A":np.random.randint(23, 89, 10),
"B": np.random.randint(23, 89, 10),
"C": np.random.randint(23, 89, 10),
"D": np.random.randint(23, 89, 10)}
source3 = ColumnDataSource(data3)
p3 = DataTable(source=source3, columns=columns, width=300, height=200,editable=True)
dumbdiv = Div()
l1 = layout([[p1], [p2], [p3]], sizing_mode='fixed')
tab1 = Panel(child=l1, title="Three Tables")
tabs = Tabs(tabs=[tab1],sizing_mode='scale_width')
show(tabs)
It works perfectly fine. My question is, if I have 100(or even more) dataframes then is there an easy way (for loop perhaps) of creating layouts accordingly? In other words, the number of dataframes I have in a list can vary and I would like to know if the bokeh layout can be arranged accordingly. Something like:-
layout_list=[]
for i in range(len(df_list)):
source = ColumnDataSource(df_list[i])
p1 = DataTable(source=source1, columns=columns, width=300, height=200,editable=True)
layout_list.append(p1)
tab1 = Panel(child=layout_list, title="Three Tables")
tabs = Tabs(tabs=[tab1],sizing_mode='scale_width')
show(tabs)
Thanks in advance.
Upvotes: 2
Views: 1401
Reputation: 225
Thanks to other posts of @bigreddot, I figured it out.
mdf is a list of dataframes.
output_file("layout.html")
plots = []
for i in range(len(mdf)):
print(i)
source1 = ColumnDataSource(mdf[i])
Columns = [TableColumn(field=Ci, title=Ci) for Ci in mdf[i].columns]
p1 = DataTable(source=source1,columns=Columns, width=3000, height=200,editable=True)
plots.append(p1)
show(column(*plots))
Upvotes: 1