web-dev-qa-db-fra.com

Python matplotlib change la couleur par défaut pour les valeurs dépassant la plage de la barre de couleur

Lors du remplissage d'une grille avec des couleurs comme lors de l'utilisation de contourf dans pyplot, j'ai besoin de trouver un moyen de changer la couleur utilisée par pyplot pour remplir les données qui dépassent la plage spécifiée de la barre de couleurs. Je souhaite avoir une barre de couleur statique qui ne modifie pas automatiquement sa plage pour s'adapter au maximum/min des données, donc avoir des valeurs extrêmes occasionnelles qui dépassent ses limites est inévitable, et des couleurs doivent être spécifiées pour ces valeurs.

La couleur par défaut pour les valeurs dépassant les limites de la barre de couleurs est le blanc, ce qui peut clairement entrer en conflit avec les données environnantes si la palette de couleurs n'a pas le blanc comme couleurs de fin. Un exemple d'image est illustré ci-dessous - notez le remplissage blanc lorsque les valeurs dépassent la plage négative de la barre de couleur:

enter image description here

Je crois qu'il existe un moyen de spécifier la couleur à utiliser à chaque limite si elles sont dépassées en utilisant rcParams, mais je n'ai pu trouver d'informations à ce sujet nulle part.

Toute aide serait appréciée.

24
Levi Cowan

Les couleurs hors limites peuvent être définies à l'aide des méthodes set_over Et set_under De la palette de couleurs; voir la documentation . Vous devrez spécifier ces valeurs lors de la création de votre palette de couleurs. Je ne vois aucun paramètre matplotlibrc pour définir la valeur par défaut pour cela, cependant. Vous pouvez également demander sur la liste de diffusion matplotlib.

Edit: je vois ce qui se passe. La zone blanche que vous décrivez ne dépasse pas les limites de la gamme de couleurs. C'est simplement l'arrière-plan vierge des axes. Étant donné que vous ne tracez que certains niveaux, tous les niveaux en dehors de cette plage ne seront pas tracés du tout, laissant ces zones vides. Pour obtenir ce que vous voulez, procédez comme suit:

cs = pyplot.contourf(x,y,z,levels=np.arange(50, 220, 20), cmap=pyplot.cm.jet, extend="both")
cs.cmap.set_under('k')
cs.set_clim(50, 210)
cb = pyplot.colorbar(cs)

L'argument "extend" est la clé; il indique à contourf d'aller de l'avant et de tracer tous les contours, mais de réduire tout en dehors de la plage donnée en catégories "trop grandes" et "trop petites". L'appel cs.set_clim Est nécessaire pour contourner une bizarrerie que j'ai découverte dans contourf lors du débogage; pour une raison quelconque, lorsque vous utilisez extend, il manipule les limites de données, nous devons donc les réinitialiser à ce que nous voulons qu'elles soient.

De plus, juste pour une question de style, vous ne devriez pas faire des choses comme Colormap.set_under(cmap,color='k'). Cela appelle la méthode de classe et passe explicitement l'instance dans, ce qui est une façon étrange de le faire. Faites simplement cmap.set_under(color="k").

29
BrenBarn