web-dev-qa-db-fra.com

Définir les limites d'une barre de couleurs dans matplotlib

J'ai vu tellement d'exemples qui ne s'appliquent tout simplement pas à mon cas. Ce que je voudrais faire est de définir une simple valeur minimale et maximale pour une barre de couleur. Il est facile de définir une plage pour une cmap d'image, mais cela ne s'applique pas à la même plage pour les valeurs minimale et maximale de la barre de couleur.

triang = Triangulation(x,y)
plt.tricontourf(triang, z, vmax=1., vmin=0.)
plt.colorbar()

La barre de couleur est toujours fixée aux limites de la donnée z, bien que la plage de cmap soit maintenant fixée entre 0 et 1.

12
Jacques MALAPRADE

Je vous propose d'incorporer votre intrigue dans une figue et de vous inspirer de cet échantillon en utilisant la barre de couleurs

data = np.tile(np.arange(4), 2)
fig = plt.figure()
ax = fig.add_subplot(121)
cax = fig.add_subplot(122)
cmap = colors.ListedColormap(['b','g','y','r'])
bounds=[0,1,2,3,4]
norm = colors.BoundaryNorm(bounds, cmap.N)
im=ax.imshow(data[None], aspect='auto',cmap=cmap, norm=norm)
cbar = fig.colorbar(im, cax=cax, cmap=cmap, norm=norm, boundaries=bounds, 
     ticks=[0.5,1.5,2.5,3.5],)
plt.show()

vous voyez que vous pouvez définir bounds pour les couleurs dans colorbar et ticks. 

ce n'est pas rigoureusement ce que vous voulez réaliser, mais la suggestion de figue pourrait vous aider.

Cet autre utilise ticks aussi pour définir l’échelle de la barre de couleur.

import numpy as np
import matplotlib.pyplot as plt

xi = np.array([0., 0.5, 1.0])
yi = np.array([0., 0.5, 1.0])
zi = np.array([[0., 1.0, 2.0],
               [0., 1.0, 2.0],
               [-0.1, 1.0, 2.0]])

v = np.linspace(-.1, 2.0, 15, endpoint=True)
plt.contour(xi, yi, zi, v, linewidths=0.5, colors='k')
plt.contourf(xi, yi, zi, v, cmap=plt.cm.jet)
x = plt.colorbar(ticks=v)
print x
plt.show()
12
octoback

Je pensais que cette question signalait un bogue, mais il s’agit en réalité d’une contrainte d’utilisation/compatibilité. La solution consiste à créer les contours de la plage de couleurs souhaitée et à utiliser la variable extend kwarg. Pour plus d'informations, jetez un coup d'œil à ce numéro . Merci à @tcaswell d’avoir fourni cette solution:

import matplotlib.pyplot as plt
import numpy as np

x, y = np.mgrid[0:1:0.01, 0:1:0.01]
r = np.sqrt(x ** 2 + y ** 2)
z = np.sin(6 * np.pi * r)

fig0, ax0 = plt.subplots(1, 1, )
cf0 = ax0.contourf(x, y, z, np.arange(0, .5, .01),
                   extend='both')
cbar0 = plt.colorbar(cf0,)

 enter image description here

À partir de là, si vous n'aimez pas les ticks de la barre de couleur, vous pouvez les ajuster avec cbar0.set_ticks. J'ai vérifié que cela fonctionne également avec tricontourf.

J'ai simplifié le code de @ tcaswell à celui qui est nécessaire pour obtenir le résultat souhaité. En outre, il a utilisé la nouvelle palette de couleurs Viridis, mais j'espère que vous aurez compris l'idée.

6
farenorth

C'est probablement la méthode la plus simple.

... (votre code comme indiqué) 

plt.colorbar(boundaries=np.linspace(0,1,5)) 

...

2
Yogesh Luthra

J'ai rencontré le même problème et ai proposé un exemple concret (bien que dénué de sens) de ce problème. La commande commentée de contourf créera une barre de couleur ayant les mêmes limites que les données, et non les limites de couleur.

L'option level de tricontourf semble être un bon moyen de contourner ce problème, bien qu'elle nécessite l'option extend = 'both' pour inclure les valeurs dépassant les niveaux du graphique.

import matplotlib.tri as mtri
import numpy as np
from numpy.random import randn
from matplotlib import colors

numpy.random.seed(0)
x = randn(300)
y = randn(300)
z = randn(*x.shape)
triangles = mtri.Triangulation(x, y)
bounds=np.linspace(-1,1,10)
# sc = plt.tricontourf(triangles, z, vmax=1., vmin=-1.)
sc = plt.tricontourf(triangles, z, vmax=1., vmin=-1., levels = bounds,\
                    extend = 'both')
cb = colorbar(sc)
_ = ylim(-2,2)
_ = xlim(-2,2)
1
oceanEngineer