Я всегда go для сервера боке, если мне нужно создавать интерактивные графики. Преимущество: Вы можете написать собственный python код, не беспокоясь о JS обратных вызовах. Минимальный пример:
Обязательно запустите bokeh serve --show test.py
из командной строки
# test.py
import numpy as np, pandas as pd
from bokeh.layouts import column, row
from bokeh.models import Slider,ColumnDataSource,TextInput
from bokeh.plotting import figure, curdoc
# Set up data
df1 = pd.DataFrame(np.random.randint(9,25,size=(2,2)),columns=["A","B"])
df2 = pd.DataFrame(np.arange(4,8).reshape(2,2),columns=["A","B"])
dfs = [df1,df2]
source = ColumnDataSource(df1)
# Set up plot
plot = figure(plot_height=400, plot_width=400, title="my source",x_range=[0,max(max(x["A"]) for x in dfs)+1],\
y_range=[0,max(max(x["B"]) for x in dfs)+1])
plot.scatter("A","B", source = source)
# Set up widgets
text = TextInput(title="title", value='my source')
data = Slider(title="Choose Data",value=0, start=0, end=1)
# Set up callbacks
def update_title(attrname, old, new):
plot.title.text = text.value
text.on_change('value', update_title)
def update_data(attrname, old, new):
# Get the current slider values
d = data.value
# Generate new data
if d == 0: source.data = df1
if d == 1: source.data = df2
data.on_change("value",update_data)
# Set up layouts and add to document
inputs = column(data)
curdoc().add_root(row(inputs, plot))
curdoc().title = "my source"