### Code/Examples
import vizro.models as vm
import vizro.plotly.express as px
from vizro import Vizro
from vizro.actions import filter_interaction
from vizro.tables import dash_ag_grid
import pandas as pd
# 1) Original DataFrame
data_fija = [
("Trelew", "con acusación", 60),
("Trelew", "sin acusación", 45),
("Trelew", "queja" , 15),
("Trelew", "consulta STJ" , 7),
("Comodoro", "con acusación", 80),
("Comodoro", "sin acusación", 66),
("Comodoro", "queja", 10),
("Comodoro", "consulta STJ", 9),
("Rawson", "con acusación", 50),
("Rawson", "sin acusación", 35),
("Rawson", "queja", 3),
("Rawson", "consulta STJ", 7),
]
df = pd.DataFrame(
data_fija,
columns=["Circunscripción", "descItem", "Valor"]
)
# 2) Grouping by circunscripción and descItem
df_group = (
df
.groupby(["Circunscripción", "descItem"], as_index=False)
.agg({"Valor": "sum"})
)
# 3) Creating the "Total" row
df_total = (
df
.groupby(["descItem"], as_index=False)
.agg({"Valor": "sum"})
)
df_total["Circunscripción"] = "Total"
# 4) Merging real circunscripciones with "Total"
df_table = pd.concat([df_group, df_total], ignore_index=True)
# 5) Summing by circunscripción for the bar chart
df_chart = (
df_table
.groupby("Circunscripción", as_index=False)
.agg({"Valor": "sum"})
)
# 6) Setting up the bar chart with custom_data=["Circunscripción"]
fig_bar = px.bar(
df_group,
x="Circunscripción",
y="Valor",
title="Circunscripciones",
custom_data=["Circunscripción"]
)
from vizro.models.types import capture
@capture("action")
def overwrite_filter_model(circunscripcion_click_data):
"""Set AgGrid filterModel equals value."""
extracted_circunscripcion_value = circunscripcion_click_data["points"][0]["customdata"][0]
return {
"Circunscripción": {
"type": "equals",
"filter": extracted_circunscripcion_value
}
}
graph_circunscripcion = vm.Graph(
id="fig_bar",
figure=fig_bar,
actions=[
vm.Action(
function=overwrite_filter_model(),
inputs=["fig_bar.clickData"],
outputs=["underlying_mi_tabla_aggrid.filterModel"],
)
]
)
# 7) Defining columnDefs and hiding "Circunscripción" so it's still filterable
columnDefs = [
{
"field": "Circunscripción",
"hide": True
},
{
"field": "descItem"
},
{
"field": "Valor"
},
]
# 8) Applying a default filterModel to show only "Total" on load
tabla_aggrid = vm.AgGrid(
id="mi_tabla_aggrid",
figure=dash_ag_grid(
id="underlying_mi_tabla_aggrid", # <--- ID added here
data_frame=df_table,
columnDefs=columnDefs,
filterModel={
"Circunscripción": {
"type": "equals",
"filter": "Total"
}
}
)
)
# 9) Building the page
page = vm.Page(
title="Total + Circunscripciones (Filter on click)",
components=[
graph_circunscripcion,
tabla_aggrid,
],
)
# 10) Creating the dashboard and running the app
dashboard = vm.Dashboard(
title="Example with 'Total' row and initial filter in the table",
pages=[page]
)
Vizro().build(dashboard).run()