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.

Barra de sincronización vertical en múltiples gráficas, siguiendo el cursor del usuario.

Estoy intentando crear una aplicación para el análisis de datos.
Tengo múltiples canales de adquisición de la misma longitud, incluyendo un vector de tiempo.
Los vectores están sincronizados (el mismo valor de índice corresponde al mismo instante de tiempo para cada matriz).

Muestro datos en diferentes figuras (UIAxes) en la figura de mi aplicación.
Para poder utilizar la aplicación de manera más fácil y mejorada, me gustaría que suceda lo siguiente: cada vez que el usuario mueve el cursor sobre cualquier gráfico, se muestre una barra vertical en la posición x correspondiente del cursor en todas las figuras. Todas las figuras muestran el mismo rango de valores x.

También tengo una figura de dispersión con puntos de GPS, aún con la misma longitud que las otras matrices.
En esa figura, me gustaría realmente tener, en lugar de la línea vertical, una mira en forma de cruz.

Encontré esta parte de código aquí pero no puedo adaptarlo a App Designer y también es bastante antiguo.

Cualquier tipo de ayuda será bienvenida.

EDIT: Versión de Matlab 2020b.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para implementar esta funcionalidad en App Designer, deberás utilizar los callbacks de MATLAB integrados para manejar eventos de movimiento del ratón. Aquí tienes los pasos que puedes seguir:

    1. Agrega una función de callback al evento “MouseMotion” de los objetos UIAxes en los que deseas mostrar la línea vertical. En esta función, puedes obtener la posición actual del ratón utilizando la propiedad “CurrentPoint” del objeto axes, y calcular la coordenada x de la línea vertical utilizando la propiedad “XLim” del objeto axes.
    2. Una vez que tengas la coordenada x de la línea vertical, puedes utilizar la función “findobj” para obtener todos los objetos UIAxes en tu figura de la aplicación, y luego recorrerlos en un bucle para dibujar la línea vertical en cada uno de ellos utilizando la función “xline”.

    3. Para el gráfico de dispersión con los datos de GPS, puedes utilizar un enfoque similar, pero en lugar de dibujar una línea vertical, puedes dibujar una mira utilizando la función “plot”. También puedes utilizar el callback “ButtonDownFcn” del gráfico de dispersión para manejar los clics del ratón y mover la mira al punto seleccionado.

    Aquí tienes un ejemplo de código para que comiences:

    % Función de callback para el movimiento del ratón en UIAxes
    function UIAxesMouseMotion(app, event, ax)
        % Obtener la posición actual del ratón
        cp = ax.CurrentPoint; 
        x = cp(1,1); % Coordenada x de la posición del ratón
    
        % Obtener todos los objetos UIAxes en la figura de la aplicación
        axesObjs = findobj(app.UIFigure, 'type', 'axes');
    
        % Dibujar una línea vertical en cada objeto UIAxes
        for i = 1:length(axesObjs)
            xlim = axesObjs(i).XLim;
            if x >= xlim(1) && x <= xlim(2) % solo dibujar la línea si el cursor está dentro de los límites del axes
                xline(axesObjs(i), x, 'Color', 'r', 'LineStyle', '--');
            end
        end
    end
    
    % Función de callback para hacer clic en el gráfico de dispersión
    function ScatterPlotButtonDown(app, event, ax)
        % Obtener la posición actual del ratón
        cp = ax.CurrentPoint;
        x = cp(1,1); y = cp(1,2);
    
        % Borrar cualquier mira existente
        delete(findobj(ax, 'Tag', 'Crosshair'));
    
        % Dibujar una mira en la posición del ratón
        plot(ax, [x x], ax.YLim, 'Color', 'r', 'LineStyle', '--', 'Tag', 'Crosshair');
        plot(ax, ax.XLim, [y y], 'Color', 'r', 'LineStyle', '--', 'Tag', 'Crosshair');
    end
    

    Luego, puedes asignar estas funciones de callback a los objetos UIAxes y gráfico de dispersión correspondientes en tu código de App Designer.

Comments are closed.