18

matplotlibのナビゲーションツールバーを変更するために次のようなことをすることは可能ですか?

  1. 次のコマンドを使用して、Figureウィンドウを生成します。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()

どうもありがとうございます。

4

6 に答える 6

25

不要なツールバー項目を削除する方法は、サブクラスを作成することです。このサブクラスは、インスタンス化され、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')]

カスタムボタンを作成する場合はNavigationToolbar2、backend_basesの定義を確認する必要があります。独自のエントリをリストに簡単に追加toolitemsし、ツールバーのサブクラスで適切なコールバック関数を定義できます。

于 2013-03-21T14:01:34.283 に答える
7

MPL 1.2.1では、を介して標準MPL図のナビゲーションツールバーのハンドラーを取得できますfigure.canvas.toolbar。以前のバージョンについてはよくわかりません。

少なくともQTバックエンドでは、QTメソッドを使用してナビゲーションツールバーに任意のウィジェットを追加することができます.addWidget()。他のバックエンドも同様の方法で動作すると思いますが、テストはしていません。

これは、ナビゲーションツールバーにを追加してMPLフィギュアのタイトルを変更する(QTバックエンドを使用した)実際の例です(QLineEdit()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()
于 2013-06-28T22:45:41.937 に答える
2

前の回答は機能しますが、非常にバックエンド固有です。もう少し洗練された解決策は、NavigationToolbar2をサブクラス化することです。これは、次の回答で行われます。Matplotlib / Tkinter-ツールバーのツールチップ のカスタマイズ目的はツールチップを変更することでしたが、ボタンの追加や削除も同様に簡単です。

于 2015-02-18T13:40:45.840 に答える
1

上記の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
于 2014-04-11T03:50:57.593 に答える
1

PyQt5とmatplotlibバージョン「3.0.2」の使用

いくつかのボタンを追加したい場合は、matplotlib.backends.backend_qt5aggからインポートされたNavigationToolbar2QT()で初期化されたクラスNavigationToolbar2()によって与えられたドキュメントに従ってください:

# 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
# )

したがって、前に述べたようにクラスを再定義する必要があります(ATMで使用可能な事前定義されたボタンも下に表示されます)。私の場合、2つのボタン(コメントした「保存」と「サブプロット」)を削除したかったので、次のようになりました。

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'),
    )

そして、NavigationToolbar2QTを呼び出します(私の場合はまだ):

figure = plt.figure()
canvas = FigureCanvas(figure)
toolbar = NavigationToolbar2QT(canvas, self)
于 2019-04-04T15:43:20.080 に答える
0

私はそれだけを見つけました

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

すべてのツールを削除するように働き、個々のツールをポップすることもうまくいきました。そうは言っても、

toolbar.toolitems=[]

動作しなかったため、コードにはこの配列への別の参照がどこかにある必要があります。

于 2018-08-03T16:27:51.440 に答える