41 votes

COMMENT FAIRE: Légende déplaçable dans matplotlib

QUESTION: Je m'inspire d'une légende sur un des axes de l'objet dans matplotlib, mais le défaut de positionnement qui prétend placer dans une smart place ne semble pas fonctionner. Idéalement, j'aimerais avoir la légende être déplacé par l'utilisateur. Comment cela peut-il être fait?

SOLUTION: Eh bien, j'ai trouvé des morceaux de la solution dispersés parmi les listes de diffusion. Je suis venu avec une belle modulaire morceau de code que vous pouvez vous déplacer dans et à utiliser... c'est ici:

class DraggableLegend:
    def __init__(self, legend):
        self.legend = legend
        self.gotLegend = False
        legend.figure.canvas.mpl_connect('motion_notify_event', self.on_motion)
        legend.figure.canvas.mpl_connect('pick_event', self.on_pick)
        legend.figure.canvas.mpl_connect('button_release_event', self.on_release)
        legend.set_picker(self.my_legend_picker)

    def on_motion(self, evt):
        if self.gotLegend:
            dx = evt.x - self.mouse_x
            dy = evt.y - self.mouse_y
            loc_in_canvas = self.legend_x + dx, self.legend_y + dy
            loc_in_norm_axes = self.legend.parent.transAxes.inverted().transform_point(loc_in_canvas)
            self.legend._loc = tuple(loc_in_norm_axes)
            self.legend.figure.canvas.draw()

    def my_legend_picker(self, legend, evt): 
        return self.legend.legendPatch.contains(evt)   

    def on_pick(self, evt): 
        if evt.artist == self.legend:
            bbox = self.legend.get_window_extent()
            self.mouse_x = evt.mouseevent.x
            self.mouse_y = evt.mouseevent.y
            self.legend_x = bbox.xmin
            self.legend_y = bbox.ymin 
            self.gotLegend = 1

    def on_release(self, event):
        if self.gotLegend:
            self.gotLegend = False

...et dans votre code...

def draw(self): 
    ax = self.figure.add_subplot(111)
    scatter = ax.scatter(np.random.randn(100), np.random.randn(100))


legend = DraggableLegend(ax.legend())

J'ai envoyé le Matplotlib-groupe utilisateurs et John Hunter, a eu la gentillesse d'ajouter ma solution à SVN TÊTE.

Le Thu, Jan 28, 2010 à 3:02 PM, Adam Fraser a écrit:

Je pensais que je voudrais partager une solution à la déplaçable légende problème depuis il m'a fallu une éternité pour assimiler tous les savoirs épars sur le listes de diffusion...

Cool -- bel exemple. J'ai ajouté le code pour la légende.py. Maintenant vous pouvez le faire

jambe = ax.légende: ()
de la jambe.draggable()

pour activer déplaçable mode. Vous pouvez appeler à plusieurs reprises cette touche func pour basculer selection de l'état.

J'espère que c'est utile pour les personnes qui travaillent avec matplotlib.

30voto

Adam Fraser Points 1639

Réponse affichée ci-dessus avec question.

15voto

Tim Swast Points 3697

Dans les versions plus récentes de Matplotlib (v1.0.1), cela est intégré.

 def draw(self): 
    ax = self.figure.add_subplot(111)
    scatter = ax.scatter(np.random.randn(100), np.random.randn(100))
    legend = ax.legend()
    legend.draggable(state=True)
 

Si vous utilisez matplotlib de manière interactive (par exemple, en mode pylab d'IPython).

 plot(range(10), range(10), label="test label")
plot(range(10), [5 for x in range(10)], label="another test")
l = legend()
l.draggable(True)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X