2012-10-02 39 views
10

是否可以像下面這樣修改matplotlib中的導航工具欄?如何在matplotlib圖形窗口中輕鬆修改導航工具欄?

  1. 生成一個數字窗口,其中:fig = figure()
  2. 獲取導航工具欄的參考,具有:tbar = fig.get_navigation_toolbar(), 或更好,但只是:tbar = fig.navtbar
  3. 通過修改工具欄參考tbar,如刪除/添加/像這樣的東西編輯按鈕:
        tbar.add_button(<a Button object>);
        tbar.remove_button(a reference to a button);
        tbar.edit_button(a reference to a button);
  4. 更新與人物:fig.canvas.draw()

非常感謝你。

+0

請問http://dalelane.co.uk/blog/?p=778有幫助嗎? – halex

+0

嗯,我之前看到過這個解決方案。如果可能的話,我正在尋找更簡單的東西。我有一種感覺,可能無法直接編輯導航工具欄對象,所以我可能需要解決您提到的解決方案。謝謝:-) – JBT

回答

16

我發現刪除不需要的工具欄項目的方法是創建一個子類,它在GTK應用程序中實例化並使用。當我手動創建Figure,FigureCanvas和NavigationToolbar對象時,這是最簡單的方法。

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

如果你想創建自定義按鈕,你應該在backend_bases的的NavigationToolbar2定義看看。您可以輕鬆地將自己的條目添加到toolitems列表中,並在工具欄子類中定義適當的回調函數。

+0

+1:對於wx,一個很好的答案是http://dalelane.co.uk/blog/?p=778 – tom10

+0

真正的解決方案! – SAAD

7

使用MPL 1.2.1,可以通過figure.canvas.toolbar獲取標準MPL圖的導航工具欄的處理程序。我不確定以前的版本。

至少在QT後端中,可以使用QT方法.addWidget()嚮導航工具欄添加任意小部件。我想其他後端將使用類似的方法工作,但我沒有測試過它們。

這是增加了一個QLineEdit()導航工具欄更改MPL圖標題的工作示例(使用QT後端)(從IPython中(pylab)與run -i ...運行,然後啓動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

除了上面的torfbotl的解決方案,您可能會在最後掛上一個額外的按鈕(帶有綠色複選標記的按鈕)。

可以在子類構造函數來緩解:

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

以前的答案工作,但後端很不具體。一個稍微優雅的解決方案是子類NavigationToolbar2,如在其他答案中所做的那樣:Matplotlib/Tkinter - customizing toolbar tooltips 目標是更改工具提示,但添加或刪除按鈕同樣微不足道。