Rysuję legendę na obiekcie osi w matplotlib, ale domyślne pozycjonowanie, które twierdzi, że umieszcza je w inteligentnym miejscu, nie działa. Idealnie, chciałbym, aby legenda była przeciągalna przez użytkownika. Jak to zrobić?Jak utworzyć przeciągalną legendę w matplotlib?
Odpowiedz
Uwaga: To jest teraz wbudowany w matplotlib
leg = plt.legend()
if leg:
leg.draggable()
będzie działać zgodnie z oczekiwaniami
Cóż, znalazłem kawałki roztworu rozrzucone wśród listach dyskusyjnych. Mam wymyślić ładnym modułowej kawałek kodu, który można wpaść i wykorzystać ... to jest tutaj:
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
... iw kodzie ...
def draw(self):
ax = self.figure.add_subplot(111)
scatter = ax.scatter(np.random.randn(100), np.random.randn(100))
legend = DraggableLegend(ax.legend())
Wysłałem e-mail do grupy użytkowników Matplotlib, a John Hunter był na tyle uprzejmy, aby dodać moje rozwiązanie do SVN HEAD.
On Thu, sty 28, 2010 3:02 PM w Adam Fraser napisał:
myślałem, że dzielić rozwiązanie problemu Draggable legendy od zajęło mi wieki przyswoić całą rozproszoną wiedzę z list adresowych ...
Fajnie - ładny przykład. Dodałem kod do legend.py. Teraz można zrobić
nóg = ax.legend()
leg.draggable()aby włączyć tryb Draggable. Możesz wielokrotnie wywoływać ten func, aby przełączać stan przeciągalny.
Mam nadzieję, że jest to pomocne dla osób pracujących z matplotlib.
W nowszych wersjach Matplotlib (v1.0.1) jest to wbudowane.
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)
Jeśli używasz matplotlib interaktywnie (na przykład w trybie pylab ipython za).
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)
- 1. Jak przenieść legendę w Highcharts?
- 2. ggplot2: jak pokazać legendę
- 3. Jak utworzyć wykres liniowy z matplotlib?
- 4. W ggplot2, jak mogę dodać dodatkową legendę?
- 5. jQuery UI - Droppable akceptuje tylko jedną przeciągalną
- 6. Zupełnie niestandardowa legenda w Matplotlib, Pythonie
- 7. Jak zrobić niestandardową legendy w matplotlib
- 8. ggplot2: ręcznie dodaj legendę
- 9. Dwa geom_points dodać legendę
- 10. Python matplotlib: Zmień etykiety osi/legendę na pogrubioną na zwykłą wagę
- 11. Dodaj legendę do geom_vline
- 12. Jak zrobić mozaikę w Matplotlib
- 13. matplotlib - Legenda w oddzielnym podplocie
- 14. Jak utworzyć wykres słupkowy matplotlib z linią progową?
- 15. Jak utworzyć wykres 4d używając Pythona z matplotlib
- 16. Jak usunąć legendę z Google GeoChart?
- 17. Jak umieścić legendę poza fabułą z pandami
- 18. Jak dodać legendę na Seaborn facetgrid bar działki
- 19. Obrót pionowy legendy Matplotlib
- 20. Jak dodać legendę w imagesc działki w Matlab
- 21. Highcharts: Ukryj i pokaż legendę
- 22. Matplotlib: Pozioma długość Linii w legendzie
- 23. przynieś legendę z przodu w gnuplot
- 24. R: Krata niszczy legendę w pdf
- 25. Dodaj drugą legendę na wykresie w R
- 26. Jak wyłączyć interaktywną legendę wykresu kołowego w Kendo Wykresy UI?
- 27. Jak wyłączyć legendę w nvd3 lub ograniczyć jej rozmiar?
- 28. Jak zmienić osie w matplotlib?
- 29. Jak używać symboli Unicode w matplotlib?
- 30. Jak mogę ukryć osie w matplotlib 3d?
Adam: zważywszy, że ten był znaczny, dokładne i wystarczająco istotne, aby dołączyć do dystrybucji matplotlib, a biorąc pod uwagę, że (chyba) usunięto oryginalne pytanie, czy mogłabyś w tym kilka zdań na szczycie tego Q, aby użytkownicy mogli zorientować się, do czego służy ten kod (aby nie musieli czytać samego kodu). I miła praca, przy okazji +1 ode mnie. – doug
Dzięki Doug. Utworzyłem pytanie na górze, zgodnie z sugestią. Mam nadzieję, że będzie to pomocne. :] –
czy można to przedłużyć na drugą oś? – denfromufa