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.