1 graph, multiple dataframes, plot types, and input filters

I have a large dataset (sqlite3 database) which consist of three tables that can be loaded in each their respective pandas dataframe. I’m building an app where I want the user to be able to first select which dataset they want to plot, and then select what type of plot (histogram, scatter, line, 3D scatter, heatmap, perhaps more), and what data they want for the axes for the plot. In addition, I want several input parameters to filter the different datasets. So basically a control panel on the left where you select everything, and then a single chart window on the right that outputs the configuration (multiple inputs, single output).

I am trying to wrap my head around sharing-data-between-callbacks, but I still find this a bit advanced as a novice user. As far as I can tell, since a div-element (like the graph figure) can only have 1 callback, I need to have a large and complicated callback function, something like:

import pandas as pd
import plotly.graph_objs as go
from dash.dependencies import Input, Output, State

[...]  # code that creates sql_query, connects to database etc.
df = pd.read_sql(query, con)

def filter_data_set_1(inputs):
    dff = df[
        & (df["Date"].between_time(inputs.startDate, inputs.endDate))
        & (df["container"].isin(inputs.contList))
        & (df["ID"].isin(inputs.IDValues))
        & (df["snr"]>inputs.snrThreshold)
        & (df["freq"]==inputs.frequency)
        & (df["data"].between(inputs.minData))
    return dff

def scatter_fig(dff, inputs):
    data = [go.Scattergl(
        name=f"id: {i}"
    ) for i in dff.ID.unique()]
    layout = go.Layout(
        title="Test plot"
    figure = {"data": data, "layout": layout}
    return figure

    Output("mhp-graph", "figure"),
    [...], # 1 input for each (dropdown-tables, sliders, datepicker etc.)
def update_graph(inputs):
    if inputs.dataset == "data_set_1":
        dff = filter_data_set_1(inputs)
    elif inputs.dataset == "data_set_2":
        dff = filter_data_set_2(inputs)
    elif inputs.dataset == "data_set_3":
        dff = filter_data_set_3(inputs)

    if inputs.plottype == "scatter":
        fig = scatter_fig(dff, inputs)
    elif inputs.plottype == "histogram":
        fig = histogram_fig(dff, inputs)

    return fig

Here I have written more in a pseude-code style than actual code (for example the variable inputs to simplify). Can anyone help me? It seems awfully convoluted, as the customizations and filters grow in size, and not really the best way to solve the problem with only one callback. Is there a way to have three separate figures and callbacks + logic, but only display one of them at the time for example? Or is this more intensive and more complex? And how can sharing data between callbacks help with my use case? I was thinking that I will have submit button that the user must press each time they want the graph to process and update their filtering changes btw. Any structuring help etc. is greatly appreciated, and other ways on how to go about implementing the callback logic / handling for this use case.