matplotlib挂钩到主页/后退/前进按钮事件

时间:2013-02-15 14:12:44

标签: python matplotlib

是否有人知道如何从matplotlib图中“获取”'主页','后退'和'前进'按钮事件?

我需要事件调用我的一些函数,以便在按下这些按钮时我的图表行为正确,即默认行为不是我需要它做的事情

Matplotlib假设底层数据集是常量,并且它需要做的就是重置x / y轴限制并重新设置这些按钮 - 不幸的是,这种假设对我的情况来说是不真实的 - 我有一个需要推送的数据堆栈弹出这些按钮事件时会触发

3 个答案:

答案 0 :(得分:18)

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

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

  1. 如果要使用不同的后端,则必须对每个后端进行子类化。
  2. 在matplotlib之外部署自己的后端并非易事。你的后端必须是一个必须在PYTHONPATH中的模块。
  3. 由于matplotlib提供的后端都不会覆盖NavigationToolbar2的{​​{1}},homeback方法。我更喜欢更简洁的猴子修补方法 例如,您可以使用自己的方法替换forward的{​​{1}}。

    NavigationToolbar2

    我们甚至可以模仿matplotlib的home风格。

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

答案 1 :(得分:6)

我不知道这个问题的后端独立解决方案。但是当你使用Qt4Agg-backend时,你可以试试这个:

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作为后端不是你的选择,我们可以尝试为其他后端做类似的事情。

答案 2 :(得分:4)

如果你只需要调整某个函数,只要调整x或y轴的大小,就可以解决这个问题,最简单的方法就是绑定你的轴生成的xlim_changedylim_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_<name>.NavigationToolbar2<name>并覆盖forwardbackhome方法。您仍然需要根据您正在使用的特定后端确切地弄清楚如何合并新的工具栏类。

如果你想实现一些与设置轴限制无关的自定义“前进/后退”控制,你可能最好不要使用widgets