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.
fonte
Respostas:
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
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
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.
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.
fonte
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.
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
Os dados vão de 0 a 12,5 com a seguinte distribuição:
Um gráfico de superfície 3D mostra alguns picos, uma calha rasa e um pequeno monte:
Agora, vamos ver alguns gráficos de contorno em 2D.
Mapeamento de cores linear e reto, que perde os recursos menores, como você observou:
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:
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):
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):
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:
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.
fonte