Czy można zrobić coś w rodzaju następującego, aby zmodyfikować pasek narzędzi nawigacyjnych w MATPOTLIB?

  1. Wygeneruj okno figurowe, z: {x0}}
  2. Uzyskaj odniesienie do paska narzędzia nawigacyjnego, z: tbar = fig.get_navigation_toolbar(), lub jeszcze lepiej, po prostu przez: tbar = fig.navtbar
  3. Zmodyfikuj pasek narzędzia przez odniesienie tbar, takie jak usunięcie / Dodaj / edytuj przycisk z czymś w rodzaju:
    tbar.add_button(<a Button object>);
    tbar.remove_button(a reference to a button);
    tbar.edit_button(a reference to a button);
  4. Zaktualizuj rysunek za pomocą: {x0}}

Dziękuję Ci bardzo.

17
JBT 2 październik 2012, 22:00

6 odpowiedzi

Najlepsza odpowiedź

Sposób, w jaki znalazłem usuwanie niechcianych elementów paska narzędzi, tworzy podklasę, która jest tworzona instancja i używana w aplikacji GTK. Jak i tak ręcznie tworzyłem rysunek, figurecanvas i nawigacjaToolbar, to był najłatwiejszy sposób.

class NavigationToolbar(NavigationToolbar2GTKAgg):
    # only display the buttons we need
    toolitems = [t for t in NavigationToolbar2GTKAgg.toolitems if
                 t[0] in ('Home', 'Pan', 'Zoom', 'Save')]

Jeśli chcesz utworzyć niestandardowe przyciski, powinieneś spojrzeć na definicję NavigationToolbar2 w Backend_bazes. Możesz łatwo dodać własne wpisy do listy toolitems i zdefiniuj odpowiednie funkcje zwrotne w podklasie paska narzędzi.

21
torfbolt 21 marzec 2013, 14:01

Dzięki MPL 1.2.1 możliwe jest uzyskanie obsługi paska narzędzi nawigacyjnych standardowej liczby MPL przez figure.canvas.toolbar. Nie jestem pewien co do poprzednich wersji.

Przynajmniej z QT Backend można dodać dowolne widżety do paska narzędzi nawigacyjnych za pomocą metody QT .addWidget(). Przypuszczam, że inne backendy będą działać za pomocą podobnych metod, ale ich nie przetestowałem.

Tutaj jest przykładem pracy (przy użyciu backend Qt), który dodaje pasek narzędzi nawigacyjnych, aby zmienić tytuł rysunku MPL (bieg z IPython (pylab) z run -i ..., a następnie uruchom run -i ... X2}}):

from PySide import QtGui, QtCore

def test():
    plot([1,2,3], lw=2)
    q = qt4_interface(gcf())
    return q   # WARNING: it's paramount to return the object otherwise, with 
               # no references, python deletes it and the GUI doesn't respond!

class qt4_interface:
    def __init__(self,fig):
        self.fig = fig

        toolbar = fig.canvas.toolbar
        self.line_edit = QtGui.QLineEdit()
        toolbar.addWidget(self.line_edit)
        self.line_edit.editingFinished.connect(self.do_something) 

    def do_something(self, *args):
        self.fig.axes[0].set_title(self.line_edit.text())
        self.fig.canvas.draw()
        #f = open('l','a'); f.write('yes\n'); f.flush(); f.close()
7
user2304916 28 czerwiec 2013, 22:45

Poprzednie odpowiedzi działają, ale są bardzo specyficzne. Wzmocnione bardziej elegancki rozwiązanie jest podklasie NavigationToolbar2, jak wykonane w tej innej odpowiedzi: MatplOTLIB / TKINTER - Dostosowywanie Nakłady paska narzędzi. Tym celem było zmianę podpowiedzi, ale dodanie lub usunięcie przycisku jest równie trywialne.

2
Community 23 maj 2017, 10:32

Oprócz rozwiązania Torfobotla powyżej możesz mieć dodatkowy przycisk wiszące na końcu (ten z zielonym znacznikiem wyboru).

Które można złagodzić w konstruktorze podklasy:

from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar

class PanOnlyToolbar(NavigationToolbar):
    # only display the buttons we need
    toolitems = [t for t in NavigationToolbar2GTKAgg.toolitems if
                 t[0] in ("Pan", )]

    def __init__(self, *args, **kwargs):
        super(PanOnlyToolbar, self).__init__(*args, **kwargs)
        self.layout().takeAt(1)  #or more than 1 if you have more buttons
1
MadeOfAir 11 kwiecień 2014, 03:50

Korzystanie z wersji PyQT5 i MatplOTLIB '3.0.2'

Jeśli chcesz dodać kilka przycisków, podążaj za Doktem podanym przez klasa NavigationToolBar2 (), który jest inicjowany w NavigationToolBar2qt (), który jest importowany z matplotlib.backends.backend_qt5agg:

# list of toolitems to add to the toolbar, format is:
# (
#   text, # the text of the button (often not visible to users)
#   tooltip_text, # the tooltip shown on hover (where possible)
#   image_file, # name of the image for the button (without the extension)
#   name_of_method, # name of the method in NavigationToolbar2 to call
# )

Musisz więc przedefiniować swoją klasę, jak poprzednio wspomniano (można również zobaczyć w obszarze wstępnie zdefiniowane przyciski ATM). W moim przypadku chciałem usunąć 2 przyciski ("Zapisz" i "Subpllots", które skomentowałem), więc dało mi:

class NavigationToolbar2QT(NavigationToolbar2QT):
    # only display the buttons we need
    NavigationToolbar2QT.toolitems = (
        ('Home', 'Reset original view', 'home', 'home'),
        ('Back', 'Back to previous view', 'back', 'back'),
        ('Forward', 'Forward to next view', 'forward', 'forward'),
        (None, None, None, None),
        ('Pan', 'Pan axes with left mouse, zoom with right', 'move', 'pan'),
        ('Zoom', 'Zoom to rectangle', 'zoom_to_rect', 'zoom'),
        # ('Subplots', 'Configure subplots', 'subplots', 'configure_subplots'),
        (None, None, None, None),
        # ('Save', 'Save the figure', 'filesave', 'save_figure'),
    )

I dzwoniąc do nawigacjiOlbar2qt (wciąż w moim przypadku):

figure = plt.figure()
canvas = FigureCanvas(figure)
toolbar = NavigationToolbar2QT(canvas, self)
1
Nqsir 9 kwiecień 2019, 06:41

Znalazłem to tylko

fig = plt.figure()
toolbar = fig.canvas.manager.toolbar
tb=toolbar.toolitems
while len(tb)>0:
    tb.pop(0)

Pracowałem, aby usunąć wszystkie narzędzia, a także pojawiają się indywidualne narzędzia. To mówi,

toolbar.toolitems=[]

Nie działa, więc kod musi gdzieś mieć inne odniesienie do tej tablicy.

0
Donald 3 sierpień 2018, 16:27