2012-10-02 18 views
10

È possibile fare qualcosa come il seguente per modificare la barra degli strumenti di navigazione in matplotlib?Come modificare facilmente la barra degli strumenti di navigazione in una finestra di figura matplotlib?

  1. generare una finestra di figura, con: fig = figure()
  2. ottenere un riferimento della navigazione tool-bar, con: tbar = fig.get_navigation_toolbar(), o meglio ancora, semplicemente: tbar = fig.navtbar
  3. Modificare lo strumento della barra attraverso il riferimento tbar, come ad esempio delete/aggiungere/modificare un pulsante con qualcosa di simile:
        tbar.add_button(<a Button object>);
        tbar.remove_button(a reference to a button);
        tbar.edit_button(a reference to a button);
  4. Aggiornare la figura con: fig.canvas.draw()

Grazie mille.

+0

Fa http://dalelane.co.uk/blog/?p=778 help? – halex

+0

Bene, ho visto questa soluzione prima. Sto cercando qualcosa di ancora più semplice se è tutto possibile.Ho la sensazione che potrebbe non essere possibile modificare direttamente l'oggetto barra degli strumenti di navigazione, quindi potrei dovermi accontentare della soluzione che hai menzionato. Grazie :-) – JBT

risposta

16

Il modo in cui ho trovato rimuovere elementi indesiderati della barra degli strumenti è creare una sottoclasse, che viene creata un'istanza e utilizzata in un'applicazione GTK. Come ho creato manualmente oggetti Figure, FigureCanvas e NavigationToolbar, questo era il modo più semplice.

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

Se si desidera creare pulsanti personalizzati, si dovrebbe dare uno sguardo sulla definizione di NavigationToolbar2 in backend_bases. È possibile aggiungere facilmente le proprie voci all'elenco toolitems e definire le funzioni di callback appropriate nella sottoclasse della barra degli strumenti.

+0

+1: per wx, una buona risposta è http://dalelane.co.uk/blog/?p=778 – tom10

+0

soluzione geniale! – SAAD

7

Con MPL 1.2.1 è possibile ottenere un gestore della barra degli strumenti di navigazione di un valore MPL standard tramite figure.canvas.toolbar. Non sono sicuro delle versioni precedenti.

Almeno con il backend QT è possibile aggiungere widget arbitrari alla barra degli strumenti di navigazione utilizzando il metodo QT .addWidget(). Suppongo che altri backend funzioneranno con metodi simili, ma non li ho testati.

Qui è un esempio di lavoro (utilizzando il backend QT) che aggiunge un QLineEdit() alla barra degli strumenti di navigazione per modificare il titolo di una figura MPL (eseguito da IPython (pylab) con run -i ..., poi lanciare test()):

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() 
0

In aggiunta alla soluzione di torfbotl sopra riportata, è possibile che alla fine ci sia un pulsante in più (quello con il segno di spunta verde).

Che può essere mitigato nel costruttore della sottoclasse:

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

Le risposte precedenti lavori, ma sono molto backend-specific. Una soluzione leggermente più elegante è la sottoclasse di NavigationToolbar2, come fatto in questa altra risposta: Matplotlib/Tkinter - customizing toolbar tooltips L'obiettivo era quello di cambiare le descrizioni dei comandi, ma l'aggiunta o la rimozione di un pulsante è ugualmente banale.

Problemi correlati