Fixer les limites d'une barre de couleur 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 un minimum simple et la valeur maximale pour une barre de couleur. Définir une plage pour une image cmap est facile, mais cela n'applique pas la même plage aux valeurs minimales et maximales de la barre de couleur. Le code ci-dessous peut expliquer:

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 cmap soit maintenant fixée entre 0 et 1.

12
demandé sur Jacques MALAPRADE 2014-02-22 13:00:30

4 réponses

je vous propose d'incorporer vous intrigue dans une fig et trouver de l'inspiration à partir de cet échantillon à l'aide de la barre de couleur

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

ce n'est pas avec rigueur ce que vous voulez accomplir, mais l'allusion à fig pourrait aider.

cet autre utilise ticks ainsi 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
répondu octoback 2017-05-23 11:53:37

je pensais que cette question pointait un bug, mais il s'avère que c'est une contrainte d'usage/compatibilité. La solution est de créer les contours pour la gamme de la barre de couleur que vous voulez, et utilisez le extend kwarg. Pour plus d'informations, jetez un coup d'oeil à ce problème. Grâce à @tcaswell pour fournir 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

D'ici si vous n'aimez pas les tiques colorbar, vous pouvez les ajuster cbar0.set_ticks. J'ai vérifié que cela fonctionne aussi avec tricontourf.

j'ai simplifié le code de @tcaswell à ce qui est nécessaire pour obtenir le résultat désiré. Aussi, il a utilisé le nouveau viridis colormap, mais j'espère que vous avez l'idée.

6
répondu farenorth 2017-05-23 12:13:46

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

...(ton code)

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

...

2
répondu Yogesh Luthra 2016-10-29 15:39:34

j'ai rencontré le même problème, et j'ai trouvé un exemple concret (quoique dénué de sens) de ce problème. La commande contourf commentée va créer une barre de couleur qui a les mêmes limites que les données, et non les limites de couleur.

l'option level De tricontourf semble être une bonne façon de contourner cela, bien qu'elle nécessite l'option extend='both' pour inclure des valeurs qui dépassent les niveaux dans la parcelle.

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
répondu oceanEngineer 2015-03-27 18:10:19