martes, 28 de enero de 2020

Obtener el dato clicado en una gráfica de Matlab y mostrar un mensaje personalizado al lado

Problema: Creamos una gráfica en Matlab y deseamos que cuando el usuario clique sobre cualquiera de los puntos que la forman, capture dicha información. A continuación se procesará para que salga un mensaje emergente personalizado con la información que nosotros deseemos

Solución: 
  • Creamos una figura nueva y nos guardamos el objeto que devuelve.
  • Creamos nuestra gráfica con normalidad con plot
  • Activamos el modo cursor mediante una llamada a "datacursormode". De entre las posibles maneras de hacerlo, usaremos la que nos devuelve el objeto "data cursor mode" para la figura actual. Este objeto nos permitirá cambiarle las propiedades y por tanto customizar el modo fácilmente. 
  • Le cambiamos la propiedad "UpdateFcn". Esta propiedad recibe un texto pero le vamos a pasar como parámetro una llamada a una función. Dicha función deberá devolver un texto, lógicamente contendrá el mensaje deseado. Para pasar la función como parámetro escribiremos @nombrefunción
  • Si deseamos pasar parámetros a dicha función, tendremos que usar llaves: {@nombrefunción, parametro1, parametro2, parametron}
  • Ejemplo de código:
    • x=[1, 2, 3]; 
    • y=x.^2;
    • Fig1=figure;
    • plot(x, y ,'LineStyle','none','Marker','.');
    • dcm_obj = datacursormode(Fig1);
    • set(dcm_obj,'UpdateFcn',{@myupdatefcn, p1, p2, p3})
  • Ahora nos falta definir la función pasada "myupdatefcn", puede hacerse debajo en el mismo fichero o crear un fichero aparte con el nombre myupdatefcn.m
  • En el ejemplo de código, se lee el punto seleccionado por el usuario (guardado en el vector "pos") y luego se usa esa información para presentar información almacenada en los 3 vectores que hemos pasado como parámetro:

    • function txt = myupdatefcn(~, event_obj, P1, P2, P3)

    • pos = get(event_obj,'Position');
    • indice = find(P1 == pos(1) & P2 == pos(2));
    • txt = {['P1 vale: ', num2str(pos(1))], ['P2 vale: ',num2str(pos(2))], ['P3 vale: ',num2str(P3(indice))]};
  • Cuando lo ejecutemos, cada vez que el usuario pase el mouse por encima, veremos la información que hemos programado
Por favor, no uses adblockers en esta página. Los anuncios no son invasivos y quizá veas algo que te interese. Esta página se mantiene gracias a ellos. Si encontraste una solución a tu problema y ahorraste tiempo, ya me doy por satisfecho. También podrías invitarme a un café con una pequeña donación en Paypal. ¡Gracias! 


No hay comentarios:

Publicar un comentario