Mostrar figuras 2D en Matlab

Para muchas aplicaciones es necesario mostrar el resultado de una matriz en Matlab. Esta entrada no es más que un recordatorio/chuleta para cuando se me olvide cómo hacerlo, aunque puede que sea útil para otras personas.

Lo primero es crear la figura donde se añadirán los ejes, títulos, subfiguras, etc. Para ello basta con utilizar el comando:

figure('color', 'white');

El argumento de color y white hacen que el fondo de la figura sea blanco, lo cual mejora el aspecto de la misma (en mi opinión).

Sobre la recién creada figura mostraremos la representación gráfica de la matriz img. El comando imagesc() es todo lo que necesitamos, y su funcionamiento es:

imagesc(img);

Esto mostrará la imagen dentro de unos ejes que van de 1 a Nr para las filas y de 1 a Nc para las columnas. Si tuviéramos un vector con los valores físicos de cada eje podríamos decirle a Matlab que los utilizara añadiéndolos a la llamada de imagesc():

imagesc(x, y, img);

Es importante asegurarse que x e y tienen exactamente Nc y Nr elementos. De tener menos elementos Matlab te avisaría con un error, y de tener más Matlab los ajustaría de forma que sólo salieran los Nc (o Nr) centrados, lo cual es un comportamiento inesperado e indeseado.

De querer ver la escala de valores de la imagen (la traducción de color a valor numérico) sólo habría que ejecutar después el comando

colorbar;

Por defecto establece unos colores de forma que el valor más bajo es de color azul oscuro y el más alto es rojo oscuro granate: el colormap ‘Jet’. A mí este me parece el mejor para representación de matrices que van de un valor máximo a uno mínimo. Sin embargo, para representaciones de matrices que tienen valores cíclicos esto no es así. Para cambiarlo sólo hay que ver las opciones de mapas de colores que tenemos (ejecutando help colormap o visitando la página web del manual) y una vez elegido aplicarlo

colormap('Jet');

Otra de las cosas importantes que hay que tener en cuenta es si los elementos de la matriz tienen la misma altura que anchura. Por ejemplo, imagina una matriz que representa una distribución de probabilidad con ejes x e y con el mismo paso. En dicho caso se representaría de forma de que cada eje se ajuste al tamaño de la figura, sin conservar la proporción entre lados.  Esto es indeseado cuando se quiere saber “a ojo” si una distribución de valores tiene simetría polar o del estilo. Para forzar a la imagen a que mantenga la proporción entre sus lados hay que usar el comando

axis image;

Además, por lo general Matlab considera que en el eje Y, cuanto menor sea el valor más alto debe aparecer, lo que provoca que la imagen esté volteada verticalmente con respecto a lo que estamos acostumbrados a ver. Para solucionarlo podemos forzar a Matlab a que ponga los valores más altos del eje y arriba con

axis xy;

Y si queremos hacer las dos cosas, que mantenga la proporción de lados y que voltee verticalmente la imagen, podemos juntarlos en un mismo comando:

axis image xy;

Como muestra, esta figura de una distribución gaussiana simétrica pero desplazada 0,3 unidades en la dirección positiva del eje y.

Figura de ejemplo 1

La figura se ha generado (incluyendo la distribución gaussiana desplazada) con el siguiente código:

% Creación de la señal
N = 1024;
w = 0.2;
x = -1:1/(N/2-1/2):1;
[xx yy] = meshgrid(x);
img = exp(-(xx.^2+ (yy-0.3).^2)/w);

% Creación de la figura
figure('color', 'white');
imagesc(x, x, img);
axis image xy;
colorbar;
colormap('Hot');

Es importante darse cuenta que aunque esta figura tiene ya bastantes detalles de estilo, sigue siendo inaceptable para una publicación en un medio serio. Por ejemplo, el que el eje Y tenga diferente intervalo entre las etiquetas que el eje X aún teniendo el mismo rango es un fallo. Lo mismo ocurre con la barra de color: es evidente que va de 0 a 1, pero no aparece ni el uno ni el otro.

Para solucionar estos problemas tenemos que usar varios comandos que sirven para indicar en qué posiciones de los ejes X, Y y de color hay que poner etiquetas y qué etiquetas poner en cada sitio.

El comando ‘set’ permite modificar las propiedades de ciertos objetos relacionados con la figura. El primer argumento es el identificador del objeto y el resto son pares de valores, siendo el primero una cadena de caracteres que identifica a la propiedad y el segundo el valor nuevo de dicha propiedad. En concreto nosotros estaremos interesados en las propiedades ‘XTick’, ‘XTickLabel’, ‘YTick’ e ‘YTickLabel’ en los objetos de ejes (axes) y de la barra de color (colorbar).

Con las propiedades ‘?Tick’ y ‘?TickLabel’ podremos definir dónde poner las etiquetas y qué etiquetas poner en cada uno de los ejes, respectivamente. Así por ejemplo, si queremos poner cinco etiquetas en los ejes X e Y que vayan de -1 a 1, los comandos que habría que introducir son:

set(gca, 'XTick', [-1 -0.5 0.0 0.5 1], ...
         'XTickLabel', {'-1.0', '-0.5', '0.0', '0.5', '1.0'});
set(gca, 'YTick', [-1 -0.5 0.0 0.5 1], ...
         'YTickLabel', {'-1.0', '-0.5', '0.0', '0.5', '1.0'});

donde ‘gca’ es una función que devuelve el identificador del objeto axes que actualmente se está utilizando.

Para el caso de la barra de colores primero tenemos que conseguir el identificador. Esto es sencillo ya que la función ‘colorbar’ te lo devuelve como argumento de salida. Así que los comandos para modificar la barra de color son:

cbh = colorbar;
set(cbh, 'YTick', [0.001 0.25 0.5 0.75 0.999], ...
         'YTickLabel', {'0', '0.25', '0.5', '0.75', '1'});

Es importante darse cuenta que en el colorbar he puesto 0.001 y 0.999 como el primer y último valor de la propiedad ‘YTick’. Esto es un truco porque muchas veces el colobar no llega exactamente a 1 sino que se queda en un valor muy próximo pero menor que 1. En dicho caso la etiqueta no aparece puesto que está fuera del rango que estamos mirando. Esto, con ciertas modificaciones en cada caso, permite evitar este efecto indeseado.

Al final el resultado es la siguiente figura:

Figura de ejemplo 2

Esto ya tiene mucha mejor pinta. El último retoque que le falta es poner títulos a los ejes y a la figura. Para ello utilizaremos los comandos ‘xlabel’, ‘ylabel’ y ‘title’. Son autoexplicativos, así que directamente pongo la figura y el código fuente utilizado para su creación.

Figura de ejemplo final

% Creación de la señal
N = 1024;
w = 0.2;
x = -1:1/(N/2-1/2):1;
[xx yy] = meshgrid(x);
img = exp(-(xx.^2+ (yy-0.3).^2)/w);

% Creación de la figura
figure('color', 'white');
imagesc(x, x, img);
axis image xy;
cbh = colorbar;
colormap('Hot');
set(gca, 'XTick', [-1 -0.5 0.0 0.5 1], ...
         'XTickLabel', {'-1.0', '-0.5', '0.0', '0.5', '1.0'});
set(gca, 'YTick', [-1 -0.5 0.0 0.5 1], ...
         'YTickLabel', {'-1.0', '-0.5', '0.0', '0.5', '1.0'});
set(cbh, 'YTick', [0.001 0.25 0.5 0.75 0.999], ...
         'YTickLabel', {'0', '0.25', '0.5', '0.75', '1'});
title('Distribución gaussiana desplazada');
xlabel('Posición (mm)');
ylabel('Posición (mm)');

About

View all posts by

Leave a Reply

Your email address will not be published. Required fields are marked *