151 votes

Barre de couleur discrète Matplotlib

J'essaie de créer une barre de couleur discrète pour un nuage de points en matplotlib.

J'ai mes données x, y et pour chaque point une valeur de balise entière que je veux voir représentée par une couleur unique, par ex.

plt.scatter(x, y, c=tag)

En général, la balise sera un nombre entier allant de 0 à 20, mais la plage exacte peut changer.

Jusqu'à présent, je n'ai utilisé que les paramètres par défaut, par ex.

plt.colorbar()

ce qui donne une gamme continue de couleurs. Idéalement, je voudrais un ensemble de n couleurs discrètes (n=20 dans cet exemple). Ce qui serait encore mieux, ce serait d'obtenir une valeur d'étiquette de 0 pour produire une couleur grise et de 1 à 20 pour les couleurs.

J'ai trouvé quelques 'cookbook' scripts mais ils sont très compliqués et je ne peux pas penser que ce soit la bonne façon de résoudre un problème apparemment simple

11voto

J'ai étudié ces idées et voici ce que j'en pense. Cela évite d'appeler BoundaryNorm ainsi que de spécifier norm en tant qu'argument pour scatter y colorbar . Cependant, je n'ai pas trouvé de moyen d'éliminer l'appel plutôt long à matplotlib.colors.LinearSegmentedColormap.from_list .

Pour rappel, matplotlib fournit des cartes de couleurs dites qualitatives, destinées à être utilisées avec des données discrètes. Set1 par exemple, a 9 couleurs faciles à distinguer, et tab20 pourrait être utilisé pour 20 couleurs. Avec ces cartes, il pourrait être naturel d'utiliser leurs n premières couleurs pour colorer des diagrammes de dispersion avec n catégories, comme le fait l'exemple suivant. L'exemple produit également une barre de couleur avec n couleurs discrètes convenablement étiquetées.

import matplotlib, numpy as np, matplotlib.pyplot as plt
n = 5
from_list = matplotlib.colors.LinearSegmentedColormap.from_list
cm = from_list(None, plt.cm.Set1(range(0,n)), n)
x = np.arange(99)
y = x % 11
z = x % n
plt.scatter(x, y, c=z, cmap=cm)
plt.clim(-0.5, n-0.5)
cb = plt.colorbar(ticks=range(0,n), label='Group')
cb.ax.tick_params(length=0)

qui produit l'image ci-dessous. Le site n dans l'appel à Set1 spécifie le premier n couleurs de cette carte de couleurs, et la dernière n dans l'appel à from_list spécifie de construire une carte avec n couleurs (la valeur par défaut étant 256). Afin de définir cm comme carte de couleurs par défaut avec plt.set_cmap j'ai jugé nécessaire de lui donner un nom et de l'enregistrer, à savoir :

cm = from_list('Set15', plt.cm.Set1(range(0,n)), n)
plt.cm.register_cmap(None, cm)
plt.set_cmap(cm)
...
plt.scatter(x, y, c=z)

scatterplot with disrete colors

0voto

ChrisC Points 1026

Je pense que vous devriez regarder couleurs.ListedColormap pour générer votre carte de couleurs, ou si vous avez juste besoin d'une carte de couleurs statique, j'ai travaillé sur une application qui pourrait aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X