Python matplotlib连接到主/后退/前进按钮事件

Python matplotlib连接到主/后退/前进按钮事件,python,matplotlib,Python,Matplotlib,有人知道如何从matplotlib图形中“获取”主按钮、“返回”按钮和“前进”按钮事件吗 我需要事件来调用我的一些函数,这样当按下这些按钮时,我的绘图就可以正常运行,即默认行为不是我所需要的 Matplotlib假设基础数据集是常量,它所需要做的只是重置x/y轴限制并为这些按钮重新启动-不幸的是,这一假设在我的情况下是不正确的-我有一个数据堆栈,需要在触发这些按钮事件时按下并弹出它,如果您可以不调用某些函数的话无论何时调整x或y轴的大小,最简单的方法就是绑定到轴生成的xlim\u changed

有人知道如何从matplotlib图形中“获取”主按钮、“返回”按钮和“前进”按钮事件吗

我需要事件来调用我的一些函数,这样当按下这些按钮时,我的绘图就可以正常运行,即默认行为不是我所需要的


Matplotlib假设基础数据集是常量,它所需要做的只是重置x/y轴限制并为这些按钮重新启动-不幸的是,这一假设在我的情况下是不正确的-我有一个数据堆栈,需要在触发这些按钮事件时按下并弹出它,如果您可以不调用某些函数的话无论何时调整x或y轴的大小,最简单的方法就是绑定到轴生成的
xlim\u changed
ylim\u changed
事件。例如:

   def on_xlim_change(*args):
          print "do your pushing and popping here..."
   ax = gca()
   ax.callbacks.connect('xlim_changed',on_xlim_change)
每当您点击前进、后退或主控键以及使用平移或缩放工具(至少在WX和GTK后端)时,都会执行此回调。但是,它仍然在matplotlib完成其轴的常规重缩放后执行

如果您真的想直接访问这些按钮回调,那么我看不到一种简单的独立于后端的方法,因为事件处理的工作方式会因您使用的后端而异。我认为基本的方法是将
matplotlib.backends.backend.\uuu.NavigationToolbar2
子类化,并覆盖
forward
back
home
方法。您仍然需要根据所使用的特定后端,准确地确定如何合并新的工具栏类


如果您想实现一些与设置轴限制无关的自定义“向前/向后”控件,您最好改用。

我不知道有没有后端独立的解决方案来解决此问题。但是,当您使用Qt4Agg后端时,可以尝试以下方法:

import matplotlib
matplotlib.use("Qt4Agg")
import pylab as p

def home_callback():
    print "home called"

def back_callback():
    print "back called"

def forward_callback():
    print "forward called"

p.ion()
p.plot(p.random((10)))

fm = p.get_current_fig_manager()

fm.toolbar.actions()[0].triggered.connect(home_callback)
fm.toolbar.actions()[1].triggered.connect(back_callback)
fm.toolbar.actions()[2].triggered.connect(forward_callback)
首先,我获取当前的图形管理器,以便访问其工具栏。然后我可以将其他回调连接到它的操作


如果您不能选择使用QT4Agg作为后端,我们可以尝试对其他后端执行类似操作。

Matplotlib不提供“主页”、“后退”或“前进”按钮事件

要添加将使用“home”、“back”或“forward”按钮事件调用的回调,常用的方法是将matplotlib后端子类化
但我不赞成这种做法。我认为它有两个缺点:

  • 如果你想使用不同的后端,你必须对它们进行子类化
  • 在matplotlib之外部署您自己的后端并非易事。您的后端必须是一个模块,该模块必须位于PYTHONPATH中
  • 由于matplotlib提供的后端都不会覆盖
    导航工具栏2
    主页
    后退
    前进
    方法。我更喜欢更简洁的猴子补丁方法。
    例如,您可以用自己的方法替换
    导航工具栏2
    主页

    import matplotlib.pyplot as plt
    from matplotlib.backend_bases import NavigationToolbar2
    
    home = NavigationToolbar2.home
    
    def new_home(self, *args, **kwargs):
        print 'new home'
        home(self, *args, **kwargs)
    
    NavigationToolbar2.home = new_home
    
    fig = plt.figure()
    plt.text(0.35, 0.5, 'Hello world!', dict(size=30))
    plt.show()
    
    我们甚至可以模仿matplotlib的
    mpl\u connect
    风格

    import matplotlib.pyplot as plt
    from matplotlib.backend_bases import NavigationToolbar2, Event
    
    home = NavigationToolbar2.home
    
    def new_home(self, *args, **kwargs):
        s = 'home_event'
        event = Event(s, self)
        event.foo = 100
        self.canvas.callbacks.process(s, event)
        home(self, *args, **kwargs)
    
    NavigationToolbar2.home = new_home
    
    def handle_home(evt):
        print 'new home'
        print evt.foo
    
    fig = plt.figure()
    fig.canvas.mpl_connect('home_event', handle_home)
    plt.text(0.35, 0.5, 'Hello world!', dict(size=30))
    plt.show()
    

    我认为接受一个答案并不意味着给予赏金——有点不直观;很高兴我注意到还有一个小时的空闲时间,希望nymk得到了。非常感谢所有高质量的答案