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

bph*_*bph 15 python matplotlib

有没有人知道如何从matplotlib数字'获得''回家','回'和'前进'按钮事件?

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

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

nym*_*ymk 19

Matplotlib不提供"主页","后退"或"前进"按钮事件.

要添加一个回调,将与"家","后退"或"前进"按钮事件中调用,一个常用的方法是子类matplotlib后端.
但我并不赞成这种做法.我认为它有两个缺点:

  1. 如果要使用不同的后端,则必须对每个后端进行子类化.
  2. 在matplotlib之外部署自己的后端并非易事.你的后端必须是一个必须在PYTHONPATH中的模块.

由于没有通过matplotlib覆盖提供后端的NavigationToolbar2home,backforward方法.我更喜欢更简洁的猴子修补方法.
例如,您可以使用自己的方法替换NavigationToolbar2's 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()
Run Code Online (Sandbox Code Playgroud)

我们甚至可以模仿matplotlib的mpl_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()
Run Code Online (Sandbox Code Playgroud)


Tho*_*anz 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)
Run Code Online (Sandbox Code Playgroud)

首先,我获得当前的数字管理器,以便我可以访问其工具栏.然后我可以将其他回调连接到其动作.

如果使用QT4Agg作为后端不是你的选择,我们可以尝试为其他后端做类似的事情.


ali*_*i_m 5

如果你能逃脱只是调用一些功能,无论何时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)
Run Code Online (Sandbox Code Playgroud)

每当您按下前进、后退或主页键以及使用平移或缩放工具(至少使用 WX 和 GTK 后端)时,都会执行此回调。但是,它仍然会在 matplotlib 已经完成其通常的轴重新缩放之后执行。

如果您真的想直接访问这些按钮回调,那么我看不到一种简单的独立于后端的方式,因为根据您使用的后端,事件处理的工作方式会有所不同。我认为基本的方法是子类化matplotlib.backends.backend_<name>.NavigationToolbar2<name>和覆盖forward,backhome方法。您仍然需要根据您使用的特定后端确切地弄清楚如何合并您的新工具栏类。

如果您想实现一些与设置轴限制没有太大关系的自定义“前进/后退”控件,您可能最好使用小部件