martes, 26 de noviembre de 2013

Cómo crear una matriz de colores en 3 dimensiones

Supongamos que quiero representar con colores una matriz. Donde el color de cada celda, depende de su valor numérico. Es decir, quiero, de una matriz como la siguiente:

f1 1 2 3
f2 4 5 6

v1 v2 v3

llegar a algo como esto:




Para ello, podría hacer algo similar a lo siguiente:

Primero, defino la matriz de datos, los ejes "x" e "y", y el estilo de colores:

A = [1 2 3; 4 5 6];
xticks = {'v1','v2','v3'};
yticks = {'f1','f2'};
estilo = 'copper';

Algunos estilos de colores posibles son 'default', 'copper', 'cool', 'spring', 'summer', 'autumn', 'winter'...

A continuación, genero el gráfico en colores de la forma siguiente:

[ny,nx] = size(A);
yticks = rot90(rot90(yticks));

figure(1)
hold on
for(i=1:1:nx)
    for(j=1:1:ny)
        X = [0 1; 0 1];
        Y = [ny-1 ny-1; ny ny];
        X = X + (i-1);
        Y = Y - (j-1);
        B = ones(2,2)*A(j,i);
        surface(X,Y,B);
    end
end

axis([0 nx 0 ny])
colormap(estilo)
set(gca,'XTick',[0.5:1:nx])
set(gca,'XTickLabel',xticks)
set(gca,'YTick',[0.5:1:ny])
set(gca,'YTickLabel',yticks)
set(gca,'Fontsize',10)
box on

Nota: Para girar el vector de strings "yticks" 180º, he usado dos veces el comando "rot90".

Para la barra lateral, utilizo los siguientes comandos:

colorbar('EastOutside', 'YTick',[1:1:6], 'YTicklabel',{'1','2','3','4','5','6'},'Fontsize',10)

La barra anterior estaba vertical, y el eje se definía con "YTick". Si la barra hubiera estado horizontal, habría que haberlo hecho con "XTick". Por ejemplo:

colorbar('SouthOutside', 'XTick',[1:1:6], 'XTicklabel',{'1','2','3','4','5','6'},'Fontsize',10)

Como sabes, si pulsas el botón "Rotate 3D", puedes elegir el punto de vista que más te guste. En este caso, sí que podríamos también haber editado el eje de las "z".

axis([0 nx 0 ny 0 6])
set(gca,'ZTick',[0:2:6])
set(gca,'ZTickLabel',{'0','2','4','6'})

No hay comentarios: