supprimer la barre de couleur de la figure dans matplotlib
Ce devrait être facile, mais je vais avoir un moment difficile avec elle. En gros, j'ai une intrigue secondaire dans matplotlib que je suis le dessin d'un hexbin intrigue à chaque fois qu'une fonction est appelée, mais chaque fois que j'appelle la fonction-je obtenir une nouvelle barre de couleur, donc ce que j'aimerais vraiment faire est de mettre à jour la barre de couleur. Malheureusement, cela ne semble pas fonctionner, puisque l'objet de la barre de couleur est attachée à est recréé par l'intrigue secondaire.hexbin.
def foo(self):
self.subplot.clear()
hb = self.subplot.hexbin(...)
if self.cb:
self.cb.update_bruteforce() # Doesn't work (hb is new)
else:
self.cb = self.figure.colorbar(hb)
Je suis maintenant dans cette fâcheuse endroit où je suis en train de supprimer la barre de couleur axes complètement et simplement de le recréer. Malheureusement, quand je supprime la barre de couleur axes, l'intrigue secondaire axes de ne pas libérer de l'espace, et de l'appel de l'auto.intrigue secondaire.reset_position() n'est pas de faire ce que j'ai pensé qu'il serait.
def foo(self):
self.subplot.clear()
hb = self.subplot.hexbin(...)
if self.cb:
self.figure.delaxes(self.figure.axes[1])
del self.cb
# TODO: resize self.subplot so it fills the
# whole figure before adding the new colorbar
self.cb = self.figure.colorbar(hb)
Quelqu'un aurait-il des suggestions?
Beaucoup apprécié!
Adam
- Je ne pense pas que vous devriez être la création d'un nouveau hexbin intrigue à chaque fois que la fonction est appelée. Je pense que ce que vous voulez est de mettre à jour les données existantes de la parcelle en quelque sorte (je ne suis pas assez familier avec hexbin-à-dire comment). J'ai quelques questions. Est-ce de la parcelle d'animation? Êtes-vous obtenir de multiples colorbars côté-à-côte? Pourriez-vous poster un exemple, avec quelques fausses données?
- J'ai considéré que, mais je sentais que c'était une voie difficile à prendre puisque c'est tout un traçage interactif de l'outil. L'utilisateur peut modifier le nombre de bacs, gridsize, les échelles de l'axe, de la source de données, etc. Je vais continuer à cogner ma tête contre cette barre de couleur chose pour l'instant, et si je frappe un mur, je vais envisager de la faire bouillir vers le bas pour un exemple de travail que je peux partager. Merci Paul.
- Vous pouvez créer un spécifique ax pour la barre de couleur claire et cette hache.
fig.colorbar(cax=cax)
etcax.cla()
Vous devez vous connecter pour publier un commentaire.
Je pense que le problème est que, avec
del
vous annulez la variable, mais pas de l'objet référencé barre de couleur.Si vous souhaitez que la barre de couleur à être retiré de la parcelle et de disparaître, vous devez utiliser la méthode
remove
de la barre de couleur instance et pour ce faire, vous devez avoir la barre de couleur dans une variable, pour laquelle vous avez deux options:cb=plt.colorbar()
alors:
cb.remove()
plt.draw() #update plot
Bien, voici ma solution. Pas très élégant, mais pas terrible hack soit.
Cela fonctionne pour mes besoins puisque je n'ai jamais eu une seule intrigue secondaire. Les personnes qui rencontrent le même problème lors de l'utilisation de multiples sous-intrigues ou lors de l'élaboration de la barre de couleur dans une position différente aurez besoin de tweak.
J'ai réussi à résoudre le même problème à l'aide de la fig.clear() et de l'affichage.clear_output()
J'ai eu un problème similaire et a joué un petit peu. Je suis venu avec deux solutions qui pourraient être un peu plus élégant:
Claire de l'ensemble de la silhouette et ajouter l'intrigue secondaire (+barre de couleur si vous le souhaitez) de nouveau.
Si il y a toujours une barre de couleur, vous pouvez simplement mettre à jour les axes avec autoscale qui met également à jour la barre de couleur.
J'ai essayé cela avec imshow, mais je suppose qu'il fonctionne de manière similaire pour les autres méthodes de traçage.
Ne veux rien enlever à l'auteur de ce post de blog (Joseph Long) mais c'est clairement la meilleure solution que j'ai trouvé jusqu'à présent. Il comprend des morceaux de code, de grandes explications et de nombreux exemples.
Pour résumer, à partir de la sortie d'un axe ax de la commande: parcelle, image, scatter, collection, etc. tels que:
Vous créez une barre de couleur de l'axe à l'aide de la make_axes_locatable et l'origine de l'axe de la parcelle.
À la création de la barre de couleur, aura la même taille que celle de la figure ou de l'intrigue secondaire et que vous pouvez modifier qu'il est largeur, emplacement, rembourrage lors de l'utilisation de la diviseur.append_axes commande.
Je suis à l'aide de matplotlib 1.4.0. C'est de cette façon-je résoudre ce problème:
Code ci-dessus dessine un contour de remplissage parcelle avec la barre de couleur, clair et dessiner un nouveau tracé de contour avec la nouvelle barre de couleur à la même figure.
En utilisant
cb.ax
je suis capable d'identifier la barre de couleur axes et effacer les anciennes barre de couleur.
Et en spécifiant
cax=cb.ax
dessine simplement la nouvelle barre de couleur dans la vieille barre de couleur axes.Je devais enlever colorbars parce que j'étais en traçant un pcolormesh et l'ajout de barre de couleur pour une illustration dans une boucle. Chaque boucle de créer une nouvelle barre de couleur, et après une dizaine de boucles, j'aurais dix colorbars. Ce qui était mauvais.
Pour supprimer colorbars, j'ai le nom de la pcolormesh et une barre de couleur variable, puis à la fin de ma boucle j'ai supprimer chaque. Il est important de retirer la barre de couleur avant retrait de la pcolormesh.
Psudo Code:
Encore une fois, il était nécessaire de supprimer la barre de couleur avant de les pcolormesh
"on_mappable_changed" a fonctionné dans mon cas. Toutefois, selon les documents, la méthode "en général ... ne devrait pas être appelé manuellement."