2010-03-29 4 views
4

Je souhaite afficher une barre de couleurs représentant les valeurs brutes d'une image à côté d'une sous-arborescence matplotlib imshow qui affiche cette image, normalisée.Comment définir une extension de barre de couleurs matplotlib?

J'ai réussi à dessiner l'image et une barre de couleurs avec succès comme ceci, mais les valeurs min et max de la barre de couleur représentent l'image normalisée (0,1) au lieu de l'image brute (0,99).

f = plt.figure() 
# create toy image 
im = np.ones((100,100)) 
for x in range(100): 
    im[x] = x 
# create imshow subplot 
ax = f.add_subplot(111) 
result = ax.imshow(im/im.max()) 

# Create the colorbar 
axc, kw = matplotlib.colorbar.make_axes(ax) 
cb = matplotlib.colorbar.Colorbar(axc, result) 

# Set the colorbar 
result.colorbar = cb 

Si quelqu'un a une meilleure maîtrise de l'API colorbar, j'aimerais avoir de vos nouvelles.

Merci! Adam

Répondre

7

Il semble que vous ayez passé le mauvais objet au constructeur de la barre de couleurs.

Cela devrait fonctionner:

# make namespace explicit 
from matplotlib import pyplot as PLT 

cbar = fig.colorbar(result) 

L'extrait ci-dessus est basé sur le code dans votre réponse; voici un exemple complet, autonome:

import numpy as NP 
from matplotlib import pyplot as PLT 

A = NP.random.random_integers(0, 10, 100).reshape(10, 10) 
fig = PLT.figure() 
ax1 = fig.add_subplot(111) 

cax = ax1.imshow(A, interpolation="nearest") 

# set the tickmarks *if* you want cutom (ie, arbitrary) tick labels: 
cbar = fig.colorbar(cax, ticks=[0, 5, 10]) 

# note: 'ax' is not the same as the 'axis' instance created by calling 'add_subplot' 
# the latter instance i bound to the variable 'ax1' to avoid confusing the two 
cbar.ax.set_yticklabels(["lo", "med", "hi"]) 

PLT.show() 

Comme je l'ai suggéré dans le commentaire ci-dessus, je choisirais un espace de nom propre que ce que vous avez - par exemple, il existe des modules avec le même nom dans NumPy et Matplotlib.

En particulier, je voudrais utiliser cette déclaration d'importation pour importer « noyau » de Matplotlib traçage de fonctionnalité:

from matplotlib import pyplot as PLT 

Bien sûr, cela ne va pas l'ensemble de l'espace de noms de matplotlib (qui est vraiment le point de cette déclaration d'importation) mais c'est généralement tout ce dont vous aurez besoin.

+0

Désintéressé @doug, pourquoi capitalisez-vous PLT et NP? – bdforbes

+0

@bdforbes: donc j'aime juste les espaces de noms qui sont propres (pas de chevauchement w/autre) plus je veux juste avoir une manière visuelle rapide de les identifier dans mon code - ici bien sûr, PLT et NP sont des variables locales liées à une bibliothèque/module qui subsume d'autres modules. – doug

1

Je sais que ce serait peut-être trop tard, mais ...
Pour me remplacer dans la dernière ligne du code d'Adam result par ax fonctionne.