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.
>>>
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.
(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
:
La fonction plt.imshow
:
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.
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.
Ajoutez/modifiez les lignes suivantes à votre code
plot = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99)
pl.colorbar(plot)