Comment trouver une association appropriée de couleur avec la valeur des données dans une visualisation?

8

Je travaille sur un projet logiciel qui consiste à créer un visualiseur pour les simulations de crue. Dans le cadre de ce projet, j'ai créé un gradient d'eau qui montre la profondeur de l'eau à des points particuliers. Pour définir quelles valeurs représenteront quelles couleurs, je passe en revue les données et j'obtiens les valeurs minimales et maximales qui se produisent et je distribue uniformément les couleurs selon cette échelle.

Cependant, il y a souvent des moments dans ces simulations qui ont beaucoup plus d'eau profonde que n'importe où ailleurs dans la simulation. Cela fait que la plupart des points sur la carte ont des couleurs très similaires et ce n'est pas très informatif et rend les zones où l'eau est plus profonde très difficiles à voir.

Mon objectif est de dédier une plus large gamme de couleurs aux profondeurs les plus fréquentes. Par exemple, si les profondeurs vont de 0 à 12 mais que la plupart des profondeurs sont comprises entre 1 et 2, je veux que plus de variation de couleur se produise dans cette plage qu'entre 11 et 12 ou 4 et 5. Il semble que je doive utiliser l'écart-type ou quelque chose impliquant une distribution normale pour ce faire, mais je suis un peu flou sur la façon dont ces choses fonctionnent et comment je peux les utiliser pour atteindre mon objectif.

Toute aide pouvant être fournie sera appréciée. Je vous remercie.

SethGunnells
la source
Pas positif, je comprends bien, mais peut-être que si vous utilisiez le logarithme de votre échelle actuelle, cela aurait l'air mieux. Avez-vous une photo que vous pourriez montrer?
2013

Réponses:

9

Il semble que vous souhaitiez dédier chaque couleur de votre palette à environ la même quantité de données.

Pour illustrer, voici un histogramme d'un ensemble de 110 relevés de profondeur simulés:

Histogramme

Imaginez que cela a été lissé. Ce faisant, l'histogramme pourrait être divisé en segments verticaux de surface égale, en utilisant autant de tranches que vous le souhaitez (j'ai utilisé10 morceaux pour cet exemple.) Pour garder les zones égales, les tranches doivent être maigres où l'histogramme est élevé - c'est-à-dire où il y a beaucoup de données - et grasses où l'histogramme est bas - c'est-à-dire où est peu de données.

Densité du noyau, tranché

Une façon de réaliser facilement le découpage consiste à tracer la quantité totale de données ("proportion cumulée") en fonction de la profondeur. Découpez l'axe vertical en intervalles pairs, puis lisez les profondeurs où les tranches traversent le tracé: utilisez-les comme points de coupure pour visualiser les profondeurs.

CDF

L'algorithme de calcul des seuils à partir des données doit être évident et simple à écrire dans presque tous les langages de programmation: triez les valeurs, divisez la liste en groupes de taille approximativement égale et choisissez des seuils pour séparer la plus grande valeur de chaque groupe de la plus petite valeur du groupe qui lui succède.

whuber
la source
2
Brillant. C'est exactement ce que je voulais et c'est beaucoup plus simple que je ne l'avais prévu. Merci beaucoup d'avoir clarifié mon problème et d'avoir fourni une solution élégante.
SethGunnells
10

Bien que la réponse de @ whuber fournisse exactement ce que vous avez demandé, je tiens à vous avertir que ce que vous demandez n'est peut-être pas le meilleur moyen de représenter visuellement vos données, pour deux raisons.

  1. Les téléspectateurs supposeront naturellement que les couleurs sont uniformément réparties par valeur (profondeur) plutôt que par rang. Vous devrez travailler dur avec votre étiquetage pour que le cerveau cognitif du spectateur annule ce que leur système visuel leur dit.
  2. Le classement n'est peut-être pas plus important pour vos spectateurs que la profondeur réelle. S'il y a beaucoup de valeurs entre 0 et 1, par exemple, est-ce important sur le plan analytique comment ces valeurs sont distribuées?

Vous connaissez bien votre application, bien sûr, donc je ne peux pas dire quelle est la bonne réponse, mais voici quelques alternatives utilisant des données générées par

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))

Les données vont de 0 à 12,5 avec la distribution suivante:

histogramme

Un tracé de surface en 3D montre quelques pics, un creux peu profond et un petit monticule:

tracé de surface

Voyons maintenant quelques tracés de contour 2D.

Cartographie linéaire linéaire des couleurs, qui manque les plus petites fonctionnalités comme vous l'avez remarqué:

cartographie linéaire des couleurs

Si la variation dans les zones profondes n'est pas importante, le découpage du mappage de couleurs permet plus de couleurs pour les petites profondeurs tout en conservant un mappage linéaire dans cette zone:

mappage de couleur linéaire écrêté

À titre de comparaison, voici la vue par couleur (désolé que ma légende soit dans les valeurs de classement plutôt que dans les valeurs de profondeur):

classement des couleurs

Je ne sais pas si c'est une bonne représentation pour votre application ou non. Le détail dans le creux peu profond est exagéré. Un mappage de couleurs de journal est similaire et présente les avantages d'avoir une interprétation réelle et peut être cohérent entre les ensembles de données, mais le journal n'est toujours pas perceptif (encore des excuses pour la légende):

cartographie des couleurs du journal

Enfin, voici une approche dans une direction légèrement différente qui peut être combinée avec l'une des options ci-dessus pour augmenter la résolution: un mappage de couleurs multicolore. Dans ce cas, la coloration est linéaire et écrêtée:

double linéaire écrêté

Post-finalement, une approche que mon logiciel ne permet pas facilement est d'utiliser un mappage de couleurs linéaire par morceaux à plusieurs teintes, que j'ai vu dans certaines cartes d'élévation. Par exemple, les basses altitudes sont des verts par incréments de 50 pieds, les altitudes moyennes sont des bronzages par incréments de 200 pieds et les hautes sont des gris par incréments de 800 pieds.

Conclusion : il est préférable que le cerveau du spectateur travaille avec votre système de perception visuelle plutôt que contre.

xan
la source
1
Merci pour la réponse. J'ai implémenté la réponse de whuber et constaté que, comme vous l'avez mentionné et comme je m'y attendais un peu, cela produisait un graphique très trompeur et peu intuitif en termes de profondeur réelle. Je pense que la solution sur laquelle j'ai opté est de faire un contraste plus net entre les couleurs "peu profondes" et les couleurs "profondes" afin que je puisse maintenir un dégradé uniforme et intuitif tout en permettant à l'utilisateur de voir plus facilement les problèmes potentiels.
SethGunnells
2
Le bleu est un choix particulièrement bon dans de nombreux cas, car le système visuel humain est beaucoup plus sensible aux variations de teinte dans cette région.
Cardinal
2
@cardinal: Tant que vos observateurs sont plus jeunes. Il y a une perte de sensibilité aux courtes longueurs d'onde avec l'âge (par exemple ncbi.nlm.nih.gov/pubmed/3230483 ).
russellpierce