¿Cómo encontrar una asociación adecuada de color con valor de datos en una visualización?

8

Estoy trabajando en un proyecto de software que implica crear un visualizador para simulaciones de inundación. Como parte de este proyecto, he creado un gradiente de agua que muestra la profundidad del agua en puntos particulares. Para establecer qué valores representarán qué colores, reviso los datos y obtengo los valores mínimos y máximos que ocurren y distribuyo uniformemente los colores de acuerdo con esa escala.

Sin embargo, a menudo hay puntos de tiempo en estas simulaciones que tienen agua significativamente más profunda que en cualquier otro lugar de la simulación. Esto hace que la mayoría de los puntos en el mapa tengan colores muy similares y esto no es muy informativo y hace que las áreas donde el agua es más profunda sean muy difíciles de ver.

Mi objetivo es dedicar una gama más amplia de colores a las profundidades que ocurren con mayor frecuencia. Por ejemplo, si las profundidades van de 0 a 12 pero la mayoría de las profundidades están entre 1 y 2, quiero que ocurra más variación de color dentro de ese rango que entre 11 y 12 o 4 y 5. Parece que necesito usar la desviación estándar o hay algo que implica una distribución normal para hacer esto, pero estoy un poco confuso sobre cómo funcionan estas cosas y cómo puedo usarlas para lograr mi objetivo.

Cualquier ayuda que se pueda proporcionar será apreciada. Gracias.

SethGunnells
fuente
No es positivo, lo entiendo correctamente, pero tal vez si usara el logaritmo de su escala actual se vería mejor. ¿Tienes una foto que puedas mostrar?
jerad

Respuestas:

9

Parece que es posible que desee dedicar cada color en su paleta a aproximadamente la misma cantidad de datos.

Para ilustrar, aquí hay un histograma de un conjunto de 110 lecturas de profundidad simuladas:

Histograma

Imagina que esto se suavizara. Al hacerlo, el histograma se podría dividir uniformemente en segmentos verticales de igual área, usando tantas rebanadas como desee (yo usé10 piezas para este ejemplo.) Para mantener las áreas iguales, los cortes deben ser delgados donde el histograma es alto, es decir, donde hay muchos datos, y gordo donde el histograma es bajo, es decir, donde hay Es poca información.

Densidad del grano, en rodajas

Una forma de realizar el corte fácilmente es trazar la cantidad total de datos ("proporción acumulativa") contra la profundidad. Corta el eje vertical en intervalos pares, luego lee las profundidades donde las rebanadas cruzan la trama: úsalas como puntos de corte para visualizar las profundidades.

CDF

El algoritmo para calcular los puntos de corte a partir de los datos debe ser obvio y fácil de escribir en casi cualquier lenguaje de programación: clasifique los valores, divida la lista en grupos de aproximadamente el mismo tamaño y elija puntos de corte para separar el valor más grande en cada grupo del valor más pequeño en el grupo que lo sucede.

whuber
fuente
2
Brillante. Esto es exactamente lo que quería y es mucho más simple de lo que esperaba. Muchas gracias por aclarar mi problema y proporcionar una solución elegante.
SethGunnells
10

Aunque la respuesta de @ whuber proporciona exactamente lo que solicitó, me gustaría advertir que lo que pide puede no ser la mejor manera de representar visualmente sus datos, por dos razones.

  1. Los espectadores asumirán naturalmente que los colores se distribuyen uniformemente por valor (profundidad) en lugar de por rango. Tendrá que trabajar duro con su etiquetado para lograr que el cerebro cognitivo del espectador anule lo que su sistema visual les está diciendo.
  2. El rango puede no ser más importante para los espectadores que la profundidad real. Si hay muchos valores entre 0 y 1, por ejemplo, ¿importa analíticamente cómo se distribuyen esos valores?

Usted conoce mejor su aplicación, por supuesto, así que no puedo decir cuál es la respuesta correcta, pero a continuación se presentan algunas alternativas que utilizan datos generados por

r = Sqrt((:x * :x + :y * :y) / 400);
t = ArcTan(:y, :x);
z = (12 * Exp(-r * r * 3)) * Abs(Sin(2 * Pi() * r) - r * Cos(3 * t))

Los datos van de 0 a 12.5 con la siguiente distribución:

histograma

Un diagrama de superficie tridimensional muestra algunos picos, un canal poco profundo y un pequeño montículo:

parcela de superficie

Ahora veamos algunas gráficas de contorno en 2-D.

Mapeo de color lineal recto, que pierde las características más pequeñas como has notado:

mapeo de color lineal

Si la variación en las áreas profundas no es importante, recortar el mapeo de color permite más colores para las profundidades más pequeñas mientras se mantiene un mapeo lineal en esa área:

mapeo de color lineal recortado

A modo de comparación, aquí está la vista de color de rango (lo siento, mi leyenda está en valores de rango en lugar de valores de profundidad):

rango de mapeo de color

No estoy seguro de si esa es una buena representación para su aplicación o no. El detalle en el canal poco profundo es exagerado. Un mapeo de color de registro es similar y tiene las ventajas de tener una interpretación real y puede ser coherente en todos los conjuntos de datos, pero el registro aún no es perceptivo (nuevamente disculpas por la leyenda):

mapeo de color de registro

Finalmente, aquí hay un enfoque en una dirección ligeramente diferente que se puede combinar con cualquiera de los anteriores para aumentar la resolución: un mapeo de colores de múltiples tonos. En este caso, el color es lineal y recortado:

lineal doble recortada

Después de finalmente, un enfoque que mi software no permite fácilmente es utilizar un mapeo de color lineal por partes de varios tonos, que he visto en algunos mapas de elevación. Por ejemplo, las altitudes bajas son verdes en incrementos de 50 pies, las altitudes medias son bronceadas en incrementos de 200 pies y las altas son grises en incrementos de 800 pies.

En pocas palabras : es mejor si el cerebro del espectador trabaja con su sistema de percepción visual en lugar de en contra de él.

xan
fuente
1
Gracias por la respuesta. Implementé la respuesta de Whuber y descubrí que, como mencionaste y como esperaba, producía un gráfico que era muy engañoso y no muy intuitivo en términos de profundidad real. Creo que la solución en la que me he decidido es hacer un contraste más nítido entre los colores "poco profundos" y los colores "profundos" para que pueda mantener un gradiente uniforme e intuitivo y al mismo tiempo hacer que sea más fácil para el usuario ver posibles áreas problemáticas.
SethGunnells
2
El blues es una opción particularmente buena en muchos casos porque el sistema visual humano es mucho más sensible a las variaciones de tono en esa región.
cardenal
2
@ cardinal: siempre y cuando tus observadores sean más jóvenes. Hay una pérdida de sensibilidad a la longitud de onda corta con la edad (por ejemplo, ncbi.nlm.nih.gov/pubmed/3230483 ).
russellpierce