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.

Modo “Point Select” en la figura interactiva de plotly.

Estoy intentando adaptar este ejemplo de script de Plotly, que se encuentra en “https://plotly.com/python/v3/selection-events/”, para permitir poblar una tabla utilizando un evento de selección del mouse de Plotly. Estoy ejecutando este fragmento de código en un cuaderno Jupyter.

Como se señala en esta publicación de Stack Overflow “https://stackoverflow.com/questions/57290864/plotly-selection-events-scatter-plot-no-update-of-data-on-mouse-selection”:

Para activar tu propia función on_selection, simplemente activa el ícono "Box Select" o "Lasso Select" en los controles incorporados de tu figura.

Imagen

De hecho, logro actualizar la tabla utilizando tanto la opción “Box Select” como la opción “Lasso Select” al activar el botón relevante en la figura interactiva, pero ¿cómo activaría la opción “Point Select”? Me gustaría seleccionar un solo punto en la gráfica de dispersión simplemente haciendo clic en él.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para activar un evento de “Punto Select” en Plotly, puedes agregar una nueva capa a tu gráfico de dispersión existente con los mismos datos y propiedades de diseño, pero con un tamaño de marcador más pequeño y un atributo de información diferente al pasar el cursor. Esta nueva capa se utilizará para detectar los clics en los puntos, mientras que el gráfico de dispersión original permanecerá sin cambios. Luego, puedes adjuntar una función de retorno de llamada a la nueva capa utilizando el método plotly.graph_objects.FigureWidget.on_click. Esta función de retorno de llamada puede actualizar la tabla correspondientemente cuando se hace clic en un punto.

    Aquí tienes un ejemplo de código basado en el código de ejemplo de Plotly vinculado en la pregunta:

    import plotly.graph_objects as go
    import plotly.io as pio
    import plotly.offline as po
    
    import numpy as np
    import pandas as pd
    
    # Crear algunos datos de muestra
    np.random.seed(123)
    x = np.random.rand(100)
    y = np.random.rand(100)
    z = np.random.rand(100)
    
    # Crear gráfico de dispersión con evento de selección
    fig = go.FigureWidget(data=go.Scatter(x=x, y=y, mode='markers', marker={'size': 10, 'color': z}))
    scatter = fig.data[0]
    table = go.FigureWidget(data=[go.Table(header=dict(values=['x', 'y', 'z']))])
    
    def update_table(trace, points, selector):
        # Actualizar la tabla cuando se realiza una selección
        selected_indices = np.array(points.point_inds)
        data = np.c_[x[selector], y[selector], z[selector]]
        table.data[0].cells.values = [data[:, i] for i in range(3)]
    
    # Agregar una capa más pequeña solo de puntos para eventos de clic
    point_trace = go.Scatter(x=x, y=y, mode='markers',
        marker={'size': 5, 'color': 'transparent', 'opacity': 0},
        hoverinfo='none')
    fig.add_trace(point_trace)
    
    # Adjuntar la función de retorno de llamada update_table a los clics en los puntos
    point_trace.on_click(update_table)
    
    # Configurar diseño y mostrar la figura y la tabla
    fig.update_layout(xaxis={'title': 'x'}, yaxis={'title': 'y'},
        dragmode='select', hovermode='closest')
    table_widget = po.iplot(table, show_link=False)
    fig.show()
    

    En este código, primero creamos un gráfico de dispersión con eventos de selección utilizando los datos de muestra. Luego, agregamos una nueva capa a la figura solo con puntos y sin información al pasar el cursor, y adjuntamos una nueva función de retorno de llamada update_table a esta capa utilizando el método on_click. Esta función es similar a la función on_selection utilizada para los eventos de selección, pero utiliza el atributo point_inds del argumento points para obtener el índice del punto clicado en lugar de los índices de selección. Finalmente, mostramos tanto la figura como la tabla utilizando el método plotly.offline.iplot.

    Con este código, deberías poder activar un evento de “Punto Select” haciendo clic en un punto en el gráfico de dispersión, lo cual actualizará la tabla con los datos correspondientes.

Comments are closed.