Cómo recuperar la instancia de la barra de colores de la figura en matplotlib

todos. Quiero actualizar la barra de colores de una figura cuando se cambian los datos de imagen. Así que algo como:

img = misc.lena() fig = plt.figure() ax = plt.imshow(im) plt.colorbar(ax) newimg = img+10*np.randn(512,512) def update_colorbar(fig,ax,newimg): cbar = fig.axes[1] ax.set_data(newimg) cbar.update_normal(ax) plt.draw() 

pero parece que los resultados devueltos de fig.axes () no tienen la instancia de la barra de colores como esperaba. Probablemente pueda pasar la instancia de la barra de colores como un argumento a la función de actualización, pero pensé que pasar un parámetro de higo podría ser lo suficientemente bueno. ¿Alguien puede explicar un poco cómo recuperar la barra de colores de la figura? ¿O por qué ‘fig.axes ()’ no devuelve la instancia AxesImage o Colobar sino solo Axes o AxesSubplot? Creo que solo necesito una mayor comprensión de las cosas de Axes / Figure. ¡Gracias!

En primer lugar, creo que te estás confundiendo un poco entre los ejes (básicamente, la ttwig), la figura, el escalar asignable (la imagen, en este caso) y la instancia de la barra de colores.

La figure es la ventana en la que se encuentra el gráfico. Es el contenedor de nivel superior.

Cada figura suele tener uno o más axes . Estas son las plots / subplots.

Las barras de colores también están dentro de la figura. Al agregar una barra de colores se crean nuevos ejes (a menos que especifique lo contrario) para que se muestre la barra de colores. (Normalmente, no se puede mostrar en los mismos ejes que la imagen, ya que la barra de colores debe tener sus propios límites de x e y, etc.)

Parte de su confusión se debe al hecho de que está mezclando la interfaz de la máquina de estado y la interfaz de OO. Está bien hacer esto, pero necesitas entender la interfaz OO.

fig.axes[1] no es la instancia de la barra de colores. Son los ejes en los que se traza la barra de colores. (Además, fig.axes[1] es solo el segundo eje en la figura. Sucede que son los ejes en los que se encuentra la barra de colores para una figura con una subplot y una barra de colores, pero que generalmente no será el caso.)

Si desea actualizar la barra de colores, deberá aferrarse a la instancia de la colorbar que devuelve la colorbar .

Aquí hay un ejemplo de cómo normalmente abordarías las cosas:

 import matplotlib.pyplot as plt import numpy as np data = np.random.random((10,10)) # Generate some random data to plot fig, ax = plt.subplots() # Create a figure with a single axes. im = ax.imshow(data) # Display the image data cbar = fig.colorbar(im) # Add a colorbar to the figure based on the image 

Si va a utilizar update_normal para actualizar la barra de colores, se espera que se ScalarMappable un ScalarMappable (por ejemplo, una imagen creada por imshow , la colección que se scatter , el ContourSet que crea el contour , etc.). (Hay otras formas de hazlo, también. A menudo, solo deseas actualizar los límites, en lugar de todo. En el caso del código anterior, deberías llamar a cbar.update_normal(im) .

Sin embargo, no ha creado una nueva AxesImage , solo ha cambiado sus datos. Por lo tanto, probablemente solo quieras hacer:

 cbar.set_clim(newimg.min(), newimg.max()) 

A veces puede ser útil recuperar una barra de colores incluso si no se mantuvo en una variable. En este caso, es posible recuperar la barra de colores de la gráfica con:

 #create a test image img=np.arange(20).reshape(5,4) plt.imshow(img) plt.colorbar() ax=plt.gca() #plt.gca() for current axis, otherwise set appropriately. im=ax.images #this is a list of all images that have been plotted cb=im[-1].colorbar #in this case I assume to be interested to the last one plotted, otherwise use the appropriate index 

Ahora puede operar en cb como si estuviera almacenado, cambiando xlim o llamando a update como se explica en otros comentarios. O puede eliminarlo con cb.remove() y volver a plt.colorbar() con plt.colorbar() .

plt.draw() debe llamar a plt.draw() o show después de actualizar el gráfico.

Por cierto, la imagen es el mapeador asociado a la barra de colores y se puede obtener con cb.mappable .