Comment récupérer l'instance de barre de couleur de la figure dans matplotlib
tous les. Je veux mettre à jour la barre de couleur d'une figure quand l'imagedata est changée. Donc quelque chose comme:
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()
mais il semble que des résultats retournés de fig.axes () n'a pas l'instance colorbar comme je l'espérais. Je peux probablement juste passer l'instance de la barre de couleur comme argument à la fonction de mise à jour, mais j'ai pensé que juste passer un paramètre de figue pourrait être suffisant. Quelqu'un peut-il expliquer un peu comment récupérer la barre de couleur de la figure? Ou pourquoi "fig.axes () ' ne renvoie pas L'instance AxesImage ou Colobar mais seulement les Axes ou AxesSubplot? Je pense que j'ai juste besoin de mieux comprendre les haches/figures.Je vous remercie!
2 réponses
tout d'abord, je pense que vous devenez un peu confus entre les axes (essentiellement, le tracé), la figure, le scalaire mappable (l'image, dans ce cas), et l'instance de barre de couleur.
Le figure
est la fenêtre que la parcelle est en. C'est le conteneur de niveau supérieur.
chaque figure a habituellement un ou plusieurs axes
. Ce sont les parcelles/sous-intrigues.
Colorbars sont également à l'intérieur de la figure. L'ajout d'un colorbar crée un nouvel axe (sauf indication contraire) pour que la barre de couleur s'affiche. (Il ne peut normalement pas être affiché dans les mêmes axes que l'image, parce que la barre de couleur doit avoir ses propres limites x et y, etc.)
une partie de votre confusion est due au fait que vous mélangez l'interface état-machine et l'interface OO. C'est bien de le faire, mais vous devez comprendre l'interface OO.
fig.axes[1]
n'est pas la barre de couleur instance. C'est les axes dans lesquels la barre de couleur est tracée. (De plus, fig.axes[1]
n'est que le deuxième axe de la figure. Il se trouve que ce sont les axes dans lesquels la barre de couleur est pour une figure avec un sous-placage et une barre de couleur, mais ce ne sera généralement pas le cas.)
si vous voulez mettre à jour la barre de couleur, vous devez vous tenir à l'instance de la barre de couleur que colorbar
retourne.
voici un exemple de la façon dont vous abordez normalement les choses:
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 vous allez utiliser update_normal
pour mettre à jour la barre de couleur, il s'attend à ce qu'un ScalarMappable
(par exemple une image créée par imshow
, la collection que scatter
crée, le ContourSet
que contour
crée, etc) soit passé. (Il y a d'autres façons de le faire. Souvent, vous voulez simplement mettre à jour les limites, plutôt que toute la chose.) Dans le cas du code ci-dessus, vous appelleriez cbar.update_normal(im)
.
Cependant, vous n'avez pas créé un nouveau AxesImage
, vous venez de changer ses données. Par conséquent, vous voulez probablement juste faire:
cbar.set_clim(newimg.min(), newimg.max())
parfois, il peut être utile de récupérer une barre de couleur même si elle n'a pas été tenue dans une variable. Dans ce cas, il est possible de récupérer la barre de couleur de l'intrigue:
#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
Maintenant vous pouvez utiliser cb
comme s'il était stocké, en changeant xlim ou en appelant update comme expliqué dans d'autres commentaires. Ou vous pouvez l'enlever avec cb.remove()
et le recréer avec plt.colorbar()
.
plt.draw()
ou show
doit être appelée après pour mettre à jour la parcelle.
soit dit en passant, image est le mappable associé à la barre de couleur et peut être obtenu avec cb.mappable
.