es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enviar variable a Dash con devolución de llamada en Python

¿Es posible tener un solo app.callback que se ejecute con diferentes entradas de matrices?
updatefigurematrix es una función que devuelve una figura basada en un dataframe de entrada. Me gustaría llamar a esta función varias veces con diferentes dataframes (matrices), pero no sé cómo hacerlo.

@app.callback(Output('tabel-matrix', 'figure'), 
              [Input('checklist', 'value')] )
def update_figure_matrix(selected_value):

    matrix_filter = matrix[matrix['First&##39;].isin(selected_value)]
    matrix_filter = matrix_filter[matrix_filter['Second'].isin(selected_value)]

    figure = px.scatter(
        matrix_filter, #dataframe
        x="First', #x
        y=&#quot;Second', #y
        size=&#quot;Total', #tamaño de las burbujas
        color=&#quot;Total',#color de las burbujas
        color_continuous_scale=px.colors.sequential.Plotly3, #tema de color
        title=&#quot;Datos asociados con el primer y segundo punto de contacto', #título del gráfico
    )
    figure.update_layout(
        xaxis_tickangle=30,#ángulo de las marcas en el eje x
        title=dict(x=0.5), #centra el título
        xaxis_tickfont=dict(size=9), #establece la fuente para el eje x
        yaxis_tickfont=dict(size=9), #establece la fuente para el eje y
        margin=dict(l=500, r=20, t=50, b=20), #establece el margen
        paper_bgcolor='LightSteelblue', #establece el color de fondo del gráfico
    )    

    return figure

# Me gustaría llamar a este código una vez con matrix1 (dataframe) y otra vez con matrix2 (diferente dataframe)
....
...
..

dcc.Graph(id='tabel-matrix', #matrix = matrix1
               ),
dcc.Graph(id='tabel-matrix', #matrix = matrix2

               ),
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible tener un solo app.callback ejecutándose en diferentes entradas de matrices. Esto se puede lograr utilizando la misma función de callback para ambos componentes dcc.Graph y especificando los argumentos de entrada y salida correspondientes.

    Por ejemplo, puedes modificar la función de callback existente para aceptar un argumento adicional de entrada (por ejemplo, matrix) de la siguiente manera:

    @app.callback(Output('tabel-matrix', 'figure'), 
                  [Input('checklist', 'value')],
                  [State('tabel-matrix', 'id')]) # agregar un argumento de estado para identificar el gráfico
    def update_figure_matrix(selected_value, graph_id):
        if graph_id == 'tabel-matrix-1':
            matrix_filter = matrix1[matrix1['First'].isin(selected_value)]
            matrix_filter = matrix_filter[matrix_filter['Second'].isin(selected_value)]
        elif graph_id == 'tabel-matrix-2':
            matrix_filter = matrix2[matrix2['First'].isin(selected_value)]
            matrix_filter = matrix_filter[matrix_filter['Second'].isin(selected_value)]
        else:
            raise ValueError('Identificador de gráfico no válido')
    
        # el resto del código sigue siendo el mismo
        figure = px.scatter(
            matrix_filter, # dataframe
            x="First", # x
            y="Second", # y
            size="Total", # tamaño de la burbuja
            color="Total", # color de la burbuja
            color_continuous_scale=px.colors.sequential.Plotly3, # tema de color
            title="Datos asociados al primer y segundo punto de contacto", # título del gráfico
        )
        figure.update_layout(
            xaxis_tickangle=30, # ángulo de la marca en el eje x
            title=dict(x=0.5), # establecer el título en el centro
            xaxis_tickfont=dict(size=9), # establecer la fuente para el eje x
            yaxis_tickfont=dict(size=9), # establecer la fuente para el eje y
            margin=dict(l=500, r=20, t=50, b=20), # establecer el margen
            paper_bgcolor="LightSteelblue", # establecer el color de fondo del gráfico
        )    
    
        return figure
    

    Luego, puedes crear dos componentes dcc.Graph con diferentes identificadores y especificar el argumento matrix correspondiente en el objeto State, de la siguiente manera:

    dcc.Graph(id='tabel-matrix-1',  # especificar un identificador único para cada gráfico
              figure=update_figure_matrix([], 'tabel-matrix-1'),  # inicializar el gráfico con entrada y ID vacíos
              ),
    dcc.Graph(id='tabel-matrix-2',  # especificar un identificador único para cada gráfico
              figure=update_figure_matrix([], 'tabel-matrix-2'),  # inicializar el gráfico con entrada y ID vacíos
              )
    

    Ten en cuenta que debes pasar el graph_id como un argumento adicional a la función update_figure_matrix para identificar qué gráfico activa la devolución de llamada.

Comments are closed.