web-dev-qa-db-fra.com

AttributeError lors de l'ajout d'une barre de couleurs dans matplotlib

Le code suivant ne s'exécute pas sur Python 2.5.4:

from matplotlib import pylab as pl
import numpy as np

data = np.random.Rand(6,6)
fig = pl.figure(1)
fig.clf()
ax = fig.add_subplot(1,1,1)
ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99)
pl.colorbar()

pl.show()

Le message d'erreur est

C:\temp>python z.py
Traceback (most recent call last):
  File "z.py", line 10, in <module>
    pl.colorbar()
  File "C:\Python25\lib\site-packages\matplotlib\pyplot.py", line 1369, in colorbar
    ret = gcf().colorbar(mappable, cax = cax, ax=ax, **kw)
  File "C:\Python25\lib\site-packages\matplotlib\figure.py", line 1046, in colorbar
    cb = cbar.Colorbar(cax, mappable, **kw)
  File "C:\Python25\lib\site-packages\matplotlib\colorbar.py", line 622, in __init__
    mappable.autoscale_None() # Ensure mappable.norm.vmin, vmax
AttributeError: 'NoneType' object has no attribute 'autoscale_None'

Comment puis-je ajouter une barre de couleur à ce code?

Voici les informations de l'interprète:

Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
38
Boris Gorelik

Remarque: J'utilise python 2.6.2. La même erreur a été générée avec votre code et la modification suivante a résolu le problème.

J'ai lu l'exemple de barre de couleurs suivant: http://matplotlib.sourceforge.net/examples/pylab_examples/colorbar_tick_labelling_demo.html

from matplotlib import pylab as pl
import numpy as np

data = np.random.Rand(6,6)
fig = pl.figure(1)
fig.clf()
ax = fig.add_subplot(1,1,1)
img = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99)
fig.colorbar(img)

pl.show()

Je ne sais pas pourquoi votre exemple n'a pas fonctionné. Je ne connais pas très bien matplotlib.

27
Gary Kerr

(C'est une très vieille question que je connais) La raison pour laquelle vous voyez ce problème est parce que vous avez mélangé l'utilisation de la machine d'état (matplotlib.pyplot) avec l'approche OO d'ajouter des images à un axes.

Le plt.imshow la fonction diffère de la ax.imshow méthode d'une manière subtilement différente. La méthode ax.imshow:

  • crée et renvoie une image qui a été ajoutée aux axes

La fonction plt.imshow:

  • crée et retourne une image qui a été ajoutée aux axes actuels, et définit l'image comme étant l'image "actuelle"/mappable (qui peut ensuite être automatiquement récupérée par le plt.colorbar fonction).

Si vous voulez pouvoir utiliser le plt.colorbar (ce que vous faites dans tous les cas sauf les plus extrêmes) avec le ax.imshow, vous devrez passer l'image retournée (qui est une instance de ScalarMappable) à plt.colorbar comme premier argument:

plt.imshow(image_file)
plt.colorbar()

équivaut (sans utiliser la machine d'état) à:

img = ax.imshow(image_file)
plt.colorbar(img, ax=ax)

Si ax est les axes actuels dans pyplot, alors le kwarg ax=ax n'est pas nécessaire.

73
pelson

J'ai trouvé une autre solution à ce problème dans un tutoriel.

Le code ci-dessous fonctionnera bien pour la méthode plt.imshow ():

def colorbar(Mappable, Orientation='vertical', Extend='both'):
    Ax = Mappable.axes
    fig = Ax.figure
    divider = make_axes_locatable(Ax)
    Cax = divider.append_axes("right", size="5%", pad=0.05)
    return fig.colorbar(
        mappable=Mappable, 
        cax=Cax,
        use_gridspec=True, 
        extend=Extend,  # mostra um colorbar full resolution de z
        orientation=Orientation
    )

fig, ax = plt.subplots(ncols=2)

img1 = ax[0].imshow(data)
colorbar(img1)

img2 = ax[1].imshow(-data)
colorbar(img2)

fig.tight_layout(h_pad=1)
plt.show()

Il peut ne pas fonctionner correctement avec d'autres méthodes de traçage. Par exemple, cela ne fonctionnait pas avec le tracé Geopandas Geodataframe.

1

Ajoutez/modifiez les lignes suivantes à votre code

plot = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99)
pl.colorbar(plot)
0
Ishan Tomar