lunes, 6 de junio de 2016

Mapas de color para Excel

Como complemento al artículo 'Gráficos de mapas de bits en Excel', he creado una librería con varios mapas de color (colour maps) listos para usarse desde VBA. Con ellos se puede cambiar fácilmente el color a un conjunto de celdas siguiendo un degradado de color vistoso e intuitivo.



La definición de todos ellos es muy sencilla y puede encontrarse en el código. Quizá solo el mítico 'Jet' de Matlab y el típico ciclo de colores HSV, rebautizado más poéticamente como 'Rainbow', merezcan ser explicados.




Precisamente el carácter cíclico de este último puede ser un inconveniente al coincidir en él los tonos con que son representadas las amplitudes máximas y mínimas.

Para usarlos basta llamar a la función correspondiente al mapa elegido (hay una para cada uno de los 11 mapas), que devolverá un entero largo directamente asignable al color de fondo de una celda en la forma que ya conocemos:

 Cells(i, j).Interior.Color = Gray(r)
 Cells(i, j).Interior.Color = Jet(r)
 Cells(i, j).Interior.Color = Rainbow(r)
 ...

El valor de r deberá ser un número real comprendido entre 0 y 1, siendo fácil adaptarlo a cualquier rango numérico con el que podamos estar trabajando.

Otra forma de acceder a los valores de los mapas de color es a través de la función ColourMap() con la siguiente sintaxis:

 Cells(i, j).Interior.Color = ColourMap(r, "Gray")
 Cells(i, j).Interior.Color = ColourMap(r, "Jet")
 Cells(i, j).Interior.Color = ColourMap(r, "Rainbow")
 ...

Se puede invertir el orden de cualquier mapa invocándolo con el complementario a 1. Por ejemplo, con esta llamada haremos corresponder las amplitudes más cercanas a 0 con los grises más claros, y las amplitudes más cercanas a 1 con los más oscuros:

 Cells(i, j).Interior.Color = Gray(1 - r)
 Cells(i, j).Interior.Color = ColourMap(1 - r, "Gray")

Podría pensarse que llamar a una función y hacer cálculos cada vez que se colorea una celda, en lugar de precalcular los mapas en tablas lookup, es poco óptimo. La realidad es que en este caso el cuello de botella con diferencia lo pone el propio "pintado" de celdas en Excel, que resulta bastante lento.

A continuación un ejemplo de uso del mapa 'Jet' para colorear una matriz numérica:



Siguiendo la misma filosofía, podemos dibujar como mapa de calor el volcán que puede descargarse de volcano.txt, definido por una cuadrícula de 87 x 61 valores topográficos.



Y para acabar unas imágenes coloreando con otros dos mapas una serie de circunferencias aleatorias de diferentes tamaños. Los círculos se han situado en el plano de acuerdo a un algoritmo de rellenado que garantiza que no se superpongan.




En el fichero colour_maps.xlsm se pueden encontrar todas las funciones de la librería, así como los ejemplos mostrados y el algoritmo de relleno con circunferencias para quien tenga curiosidad.


No hay comentarios:

Publicar un comentario

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.