如何在matplotlib图窗口中轻松修改导航工具栏?

JBT*_*JBT 16 python 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()

非常感谢你.

tor*_*olt 19

我发现删除不需要的工具栏项的方法是创建一个子类,它在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')]
Run Code Online (Sandbox Code Playgroud)

如果要创建自定义按钮,则应该查看NavigationToolbar2backend_bases中的定义.您可以轻松地将自己的条目添加到toolitems列表中,并在工具栏子类中定义适当的回调函数.

  • 您不需要对工具栏进行子类化,只需使用 [`ToolManager`](https://matplotlib.org/3.1.1/api/backend_managers_api.html#matplotlib.backend_managers.ToolManager)。[这是一个很好的例子](https://matplotlib.org/3.1.1/gallery/user_interfaces/toolmanager_sgskip.html)。 (3认同)

use*_*916 7

使用MPL 1.2.1,可以获得标准MPL数字导航工具栏的处理程序figure.canvas.toolbar.我不确定以前的版本.

至少使用QT后端,可以使用QT方法将任意小部件添加到导航工具栏.addWidget().我想其他后端将使用类似的方法,但我没有测试它们.

这是一个工作示例(使用QT后端),QLineEdit()在导航工具栏中添加一个更改MPL图形的标题(从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()
Run Code Online (Sandbox Code Playgroud)