import altair as alt
import numpy as np
import pandas as pd
import solara
columns = "abcd"
d = {"idx": np.arange(100), **{c: np.random.rand(100) for c in columns}}
df = pd.DataFrame(d)
def make_chart(column: str):
selection = alt.selection_interval(name="range", encodings=["x"])
chart = (
alt.Chart(df)
.mark_line()
.encode(x=alt.X("idx:Q"), y=alt.Y(f"{column}:Q"))
.add_params(selection)
)
return chart
@solara.component
def SelectionChart(chart, on_select):
view = alt.JupyterChart.element(chart=chart)
print("rerender selection chart")
def bind():
print("rebind")
widget = solara.get_widget(view)
widget.selections.observe(on_select, "range")
solara.use_effect(bind, [chart])
@solara.component
def Page():
selection = solara.use_reactive(None)
column = solara.use_reactive("a")
solara.Text(str(selection.value))
solara.Select(label="Column", value=column.value, on_value=column.set, values=list(columns))
# view = alt.JupyterChart.element(chart=make_chart("a"))
SelectionChart(make_chart(column.value), on_select=selection.set)
solara.DataFrame(df)