Como encontrar uma associação adequada de cores com o valor dos dados em uma visualização?

8

Estou trabalhando em um projeto de software que envolve a criação de um visualizador para simulações de inundações. Como parte deste projeto, criei um gradiente de água que mostra a profundidade da água em pontos específicos. Para definir quais valores representarão quais cores, analiso os dados e obtenho os valores mínimos e máximos que ocorrem e distribuo uniformemente as cores de acordo com essa escala.

No entanto, muitas vezes há momentos nessas simulações que têm água significativamente mais profunda do que em qualquer outro lugar da simulação. Isso faz com que a maioria dos pontos do mapa tenha cores muito semelhantes e isso não é muito informativo e dificulta a visualização das áreas onde a água é mais profunda.

Meu objetivo é dedicar uma gama maior de cores a profundidades que ocorrem com mais frequência. Por exemplo, se as profundidades vão de 0 a 12, mas a maioria está entre 1 e 2, quero que ocorra mais variação de cor dentro desse intervalo do que entre 11 e 12 ou 4 e 5. Parece que preciso usar o desvio padrão ou algo envolvendo distribuição normal para fazer isso, mas estou um pouco confuso sobre como essas coisas funcionam e como posso usá-las para alcançar meu objetivo.

Qualquer ajuda que possa ser fornecida será apreciada. Obrigado.

SethGunnells
fonte
Não é positivo, eu entendi corretamente, mas talvez, se você usasse o logaritmo da sua escala atual, ficaria melhor. Você tem uma foto que possa mostrar?
Jerad

Respostas:

9

Parece que você pode dedicar cada cor da sua paleta a aproximadamente a mesma quantidade de dados.

Para ilustrar, aqui está um histograma de um conjunto de leituras de profundidade simuladas:110

Histograma

Imagine que isso foi resolvido. Ao fazer isso, o histograma pode ser dividido igualmente em segmentos verticais de área igual, usando quantas fatias você desejar (usei peças para este exemplo.) Para manter as áreas iguais, as fatias devem ser finas onde o histograma é alto - ou seja, onde há muitos dados - e gordura, onde o histograma é baixo - ou seja, onde há poucos dados.10

Densidade do núcleo, fatiada

Uma maneira de realizar o fatiamento facilmente é plotar a quantidade total de dados ("proporção cumulativa") em relação à profundidade. Corte o eixo vertical em intervalos regulares e leia as profundidades nas quais as fatias cruzam o gráfico: use-as como pontos de corte para visualizar profundidades.

CDF

O algoritmo para calcular os pontos de corte a partir dos dados deve ser óbvio e simples de escrever em praticamente qualquer linguagem de programação: classifique os valores, divida a lista em grupos de tamanho aproximadamente igual e escolha pontos de corte para separar o maior valor em cada grupo do menor valor no grupo que o sucede.

whuber
fonte
2
Brilhante. Era exatamente isso que eu queria e é muito mais simples do que eu havia previsto. Muito obrigado por esclarecer meu problema e fornecer uma solução elegante.
SethGunnells
10

Embora a resposta do @ whuber forneça exatamente o que você pediu, gostaria de advertir que o que você pede pode não ser a melhor maneira de representar visualmente seus dados, por dois motivos.

  1. Os espectadores presumirão naturalmente que as cores são distribuídas igualmente por valor (profundidade) e não por classificação. Você terá que trabalhar duro com sua rotulagem para fazer com que o cérebro cognitivo do espectador anule o que o sistema visual lhes diz.
  2. A classificação pode não ser mais importante para os espectadores do que a profundidade real. Se houver muitos valores entre 0 e 1, digamos, importa analiticamente como esses valores são distribuídos?

Você conhece melhor sua aplicação, é claro, então não posso dizer qual é a resposta certa, mas abaixo estão algumas alternativas usando dados gerados 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))

Os dados vão de 0 a 12,5 com a seguinte distribuição:

histograma

Um gráfico de superfície 3D mostra alguns picos, uma calha rasa e um pequeno monte:

plotagem de superfície

Agora, vamos ver alguns gráficos de contorno em 2D.

Mapeamento de cores linear e reto, que perde os recursos menores, como você observou:

mapeamento linear de cores

Se a variação nas áreas profundas não for importante, o recorte do mapeamento de cores permitirá mais cores para profundidades menores, mantendo um mapeamento linear nessa área:

mapeamento de cores linear recortado

Para comparação, aqui está a exibição colorida de classificação (desculpe que minha legenda esteja nos valores de classificação em vez de valores de profundidade):

classificação de mapeamento de cores

Não tenho certeza se essa é uma boa representação para o seu aplicativo ou não. Os detalhes na calha rasa são exagerados. Um mapeamento de cores de log é semelhante e tem as vantagens de ter uma interpretação real e pode ser consistente entre os conjuntos de dados, mas o log ainda não é perceptivo (desculpas novamente pela legenda):

mapeamento de cores de log

Finalmente, aqui está uma abordagem em uma direção ligeiramente diferente que pode ser combinada com qualquer uma das opções acima para aumentar a resolução: um mapeamento de cores em vários tons. Nesse caso, a coloração é linear e cortada:

linear recortado duplo

Posteriormente, uma abordagem que meu software não permite prontamente é usar um mapeamento de cores linear em várias partes, que já vi em alguns mapas de elevação. Por exemplo, as altitudes baixas são verdes em incrementos de 50 pés, as altitudes médias são bronzeadas em incrementos de 200 pés e as altas são cinzas em incrementos de 800 pés.

Conclusão : é melhor se o cérebro do espectador funcionar com o seu sistema de percepção visual em vez de contra ele.

xan
fonte
1
Obrigado pela resposta. Eu implementei a resposta do whuber e descobri que, como você mencionou e como eu esperava, ele produziu um gráfico muito enganoso e pouco intuitivo em termos de profundidade real. Acho que a solução em que decidi é fazer um contraste mais nítido entre cores "rasas" e cores "profundas", para que eu possa manter um gradiente uniforme e intuitivo, facilitando ainda mais a visualização de possíveis áreas problemáticas pelo usuário.
SethGunnells
2
O blues é uma escolha particularmente boa em muitos casos, porque o sistema visual humano é muito mais sensível às variações de matiz naquela região.
cardeal
2
@ cardinal: Desde que seus observadores sejam mais jovens. Há uma perda da sensibilidade do comprimento de onda curto com a idade (por exemplo, ncbi.nlm.nih.gov/pubmed/3230483 ).
russellpierce