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! 


viernes, 24 de enero de 2020

Cambiar el directorio por defecto de Jupyter Notebook con y sin Anaconda (en Windows)

Problema: Deseamos modificar la carpeta donde arranca Jupyter Notebook. Ya sea lanzándolo individualmente o desde dentro de Anaconda

Solución si lo arrancamos directamente: 
  • Buscamos el acceso directo a Jupyter Notebook que utilizamos para arrancarlo: Si no sabemos donde está, pulsamos el botón de windows y escribimos Jupyter. Cuando salga el icono del programa, clicamos con el derecho en "abrir ubicación del archivo"
  • Una vez identificado el programa en su directorio, le clicamos con el derecho y vamos a propiedades
  • En la ventana que se abre, vamos a "Destino" y cambiamos al final donde pone %USERPROFILE% por el directorio que deseemos entre comillas dobles, por ejemplo:  "K:\JUPYTER NOTEBOOKS"
  • Aplicamos, aceptamos y listo.
Solución si lo arrancamos desde Anaconda: 
  • Hacemos todos los pasos anteriores y además:
  • Arrancamos una línea de comandos de Anaconda (prompt) y escribimos jupyter notebook --generate-config
  • Veremos un mensaje que dice "Writing default config to: XXXX" buscamos ese archivo y lo abrimos con un editor.
  • Buscamos la línea donde dice: “#c.NotebookApp.notebook_dir = ‘‘
  • La descomentamos, es decir, eliminamos la # inicial
  • Añadimos nuestro directorio entre comillas dobles, por ejemplo: c.NotebookApp.notebook_dir = "K:\JUPYTER NOTEBOOKS"
  • Lo guardamos y reiniciamos Anaconda prompt y/o Anaconda navigator. La próxima vez que lancemos Jupyter ya arrancará donde deseamos.
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!