2010-04-15 18 views
23

El siguiente código no se ejecuta en Python 2.5.4:AttributeError al tiempo que añade barra de colores en matplotlib

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() 

El mensaje de error es

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' 

¿Cómo puedo agregar barra de colores a este código?

A continuación se presenta la información intérprete:

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. 
>>> 

Respuesta

15

Nota: Estoy usando Python 2.6.2. El mismo error se presentó con su código y la siguiente modificación resolvió el problema.

leí el siguiente ejemplo barra de colores: 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) 
cax = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99) 
fig.colorbar(cax) 

pl.show() 
No

seguro de por qué tu ejemplo no funcionó. No estoy tan familiarizado con matplotlib.

+7

Uno debe tener cuidado con los nombres de las variables aquí. En la función de la barra de color, hay una palabra clave llamada 'cax' que significa' colorbar axes' (que no es lo que ha llamado 'cax'), un mejor nombre para el resultado de' imshow' podría ser 'img'. – pelson

47

(Esta es una pregunta muy antigua que sé) La razón por la que está viendo este problema es porque ha mezclado el uso de la máquina de estado (matplotlib.pyplot) con el enfoque OO de agregar imágenes a un eje. La función plt.imshow difiere del método ax.imshow de una manera sutilmente diferente. El método ax.imshow:

  • crea y devuelve una imagen que se ha añadido a los ejes

La función plt.imshow:

  • crea y devuelve una imagen que se ha añadido a la los ejes actuales, y establece que la imagen sea la imagen/mapa "actual" (que luego puede ser recogido automáticamente por la función plt.colorbar).

Si usted quiere ser capaz de utilizar el plt.colorbar (que en todo menos en los casos más extremos, lo hace) con el método ax.imshow, tendrá que pasar la imagen devuelta (que es una instancia de una ScalarMappable) a plt.colorbar como primer argumento:

plt.imshow(image_file) 
plt.colorbar() 

es equivalente (sin usar la máquina de estado) a:

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

si el eje es la corriente ejes en pyplot, entonces el kwarg ax=ax no es necesario.

+1

¿Hay alguna manera de acceder a la imagen desde el objeto de ejes en sí?Supongamos que está escribiendo una función a la que se le pasa un objeto de ejes que ya tiene una imagen graficada, y desea que su función agregue una barra de colores. Me gustaría hacer algo como plt.colorbar (ax.image, ax = ax). – Emma

+0

Puede usar el atributo '' images'' en los ejes para obtener una lista de imágenes dentro de los ejes. Alternativamente, la imagen "activa" en los ejes está disponible con '' gci'' (de la memoria). – pelson

-2

Agregar/editar las siguientes líneas en su código

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

no responde la pregunta – invictus

+0

@invictus La respuesta es similar a la que Gary ha dado. Responde satisfactoriamente si pone un poco de esfuerzo para INTENTAR y EDITAR el código utilizando todo lo que he escrito. El código del autor de la pregunta no funciona porque a pl.colorbar() se le da una instancia incorrecta para trazar. 'ax' definido en el código es una instancia de ventana por defecto. pl.colorbar() tiene que dirigirse a la instancia de diagrama. En mi caso, 'trama' es lo que se debe dar a pl.colorbar() que es similar a 'cax' dada por Gary –

Cuestiones relacionadas