# Vizro is an open-source toolkit for creating modular data visualization applications.
# check out https://github.com/mckinsey/vizro for more info about Vizro
# and checkout https://vizro.readthedocs.io/en/stable/ for documentation.
import numpy as np
import pandas as pd
import vizro.models as vm
import vizro.plotly.express as px
from vizro import Vizro
from vizro.managers import data_manager
df = px.data.iris()
df["date_column"] = pd.date_range(start=pd.to_datetime("2024-01-01"), periods=len(df), freq="D")
df["is_setosa"] = df["species"] == "setosa"
data_manager["static_df"] = df
data_manager["dynamic_df"] = lambda number_of_points=10: df.head(number_of_points)
SPECIES_COLORS = {"setosa": "#00b4ff", "versicolor": "#ff9222", "virginica": "#3949ab"}
page_5 = vm.Page(
title="Sliders stress-test",
components=[
vm.Container(
controls=[
vm.Filter(column="sepal_length", selector=vm.RangeSlider(title="No Config")),
vm.Filter(column="sepal_length", selector=vm.RangeSlider(min=0, max=10, title="Min/Max")),
vm.Filter(
column="sepal_length", selector=vm.RangeSlider(min=0.13, max=10.13, title="Min-flot/Max-float")
),
vm.Filter(column="sepal_length", selector=vm.RangeSlider(min=4.3, max=7.9, step=1, title="Step")),
vm.Filter(column="sepal_length", selector=vm.RangeSlider(step=0.5, title="Step-float")),
vm.Filter(
column="sepal_length",
selector=vm.RangeSlider(marks={5: "5", 6.1: "6.1", 7.2: "7.2"}, title="Marks"),
),
vm.Filter(
column="sepal_length", selector=vm.RangeSlider(min=0, max=10, step=0.5, title="Min/Max/Step-float")
),
vm.Filter(
column="sepal_length",
selector=vm.RangeSlider(min=0.13, max=10.13, step=1, title="Min-float/Max-float/Step"),
),
vm.Filter(
column="sepal_length",
selector=vm.RangeSlider(min=0.13, max=10.13, step=0.5, title="Min-float/Max-float/Step-float"),
),
vm.Filter(
column="sepal_length",
selector=vm.RangeSlider(min=0, max=10, marks={0: "0", 5: "5", 10: "10"}, title="Min/Max/Marks"),
),
vm.Filter(
column="sepal_length",
selector=vm.RangeSlider(
min=0.13,
max=10.13,
marks={0.13: "0.13", 5.13: "5.13", 10.13: "10.13"},
title="Min-float/Max-float/Marks-float",
),
),
vm.Filter(
column="sepal_length",
selector=vm.RangeSlider(
min=0, max=10, step=1, marks={0: "0", 5: "5", 10: "10"}, title="Min/Max/Step/Marks"
),
),
vm.Filter(
column="sepal_length",
selector=vm.RangeSlider(
min=0.13,
max=10.13,
step=0.5,
marks={0.13: "0.13", 5.13: "5.13", 10.13: "10.13"},
title="Min-float/Max-float/Step-float/Marks-float",
),
),
vm.Filter(column="sepal_length", selector=vm.RangeSlider(marks=None, title="Marks=None")),
vm.Filter(column="sepal_length", selector=vm.RangeSlider(step=1, marks=None, title="Step/Marks=None")),
vm.Filter(
column="sepal_length",
selector=vm.RangeSlider(
min=0.13,
max=10.13,
step=0.5,
marks=None,
title="Min-float/Max-float/Step-float/Marks=None",
),
),
],
components=[
vm.Graph(
id="graph_5",
figure=px.scatter(
"dynamic_df",
x="sepal_width",
y="sepal_length",
color="species",
color_discrete_map=SPECIES_COLORS,
),
)
],
)
],
controls=[
vm.Parameter(
targets=["graph_5.data_frame.number_of_points"],
selector=vm.Slider(min=10, max=150, step=10, title="DataFrame Parameter"),
),
# OK
vm.Filter(column="sepal_length", selector=vm.Slider(title="No Config")),
# OK
vm.Filter(column="sepal_length", selector=vm.Slider(min=0, max=10, title="Min/Max")),
# OK
vm.Filter(column="sepal_length", selector=vm.Slider(min=0.13, max=10.13, title="Min-flot/Max-float")),
# Doesn't work right, because mark+dot are not shown, but handle stops
vm.Filter(column="sepal_length", selector=vm.Slider(step=1, title="Step")),
# Doesn't work right, because mark+dot are not shown, but handle stops
vm.Filter(column="sepal_length", selector=vm.Slider(step=0.5, title="Step-float")),
# OK
vm.Filter(column="sepal_length", selector=vm.Slider(marks={5: "5", 6.1: "6.1", 7.2: "7.2"}, title="Marks")),
# Doesn't work right, because mark+dot are not shown, but handle stops
vm.Filter(column="sepal_length", selector=vm.Slider(min=0, max=10, step=0.5, title="Min/Max/Step-float")),
vm.Filter(
column="sepal_length",
selector=vm.Slider(min=0.13, max=10.13, step=1, title="Min-float/Max-float/Step"),
),
vm.Filter(
column="sepal_length",
selector=vm.Slider(min=0.13, max=10.13, step=0.5, title="Min-float/Max-float/Step-float"),
),
vm.Filter(
column="sepal_length",
selector=vm.Slider(min=0, max=10, marks={0: "0", 5: "5", 10: "10"}, title="Min/Max/Marks"),
),
vm.Filter(
column="sepal_length",
selector=vm.Slider(
min=0.13,
max=10.13,
marks={0.13: "0.13", 5.13: "5.13", 10.13: "10.13"},
title="Min-float/Max-float/Marks-float",
),
),
vm.Filter(
column="sepal_length",
selector=vm.Slider(min=0, max=10, step=1, marks={0: "0", 5: "5", 10: "10"}, title="Min/Max/Step/Marks"),
),
vm.Filter(
column="sepal_length",
selector=vm.Slider(
min=0.13,
max=10.13,
step=0.5,
marks={0.13: "0.13", 5.13: "5.13", 10.13: "10.13"},
title="Min-float/Max-float/Step-float/Marks-float",
),
),
# OK
vm.Filter(column="sepal_length", selector=vm.Slider(marks=None, title="Marks=None")),
# If step + marks are none, why is there a mid point where the handle stops?
vm.Filter(column="sepal_length", selector=vm.Slider(step=1, marks=None, title="Step/Marks=None")),
vm.Filter(
column="sepal_length",
selector=vm.Slider(
min=0.13,
max=10.13,
step=0.5,
marks=None,
title="Min-float/Max-float/Step-float/Marks=None",
),
),
],
)
dashboard = vm.Dashboard(pages=[page_5])
Vizro().build(dashboard).run()