2024-05-10 14:47:37 发布
网友
有人知道如何从matplotlib图形中“获取”home、back和forward按钮事件吗?
我需要事件来调用我的一些函数,这样当按下那些按钮时,我的绘图就可以正常工作,也就是说,默认的行为不是做我需要它做的事情
Matplotlib假设底层数据集是恒定的,它需要做的只是重置这些按钮的x/y轴限制和replot—不幸的是,这种假设对我来说是不正确的—我有一个数据堆栈,需要在触发这些按钮事件时按下并弹出
如果只要在调整x或y轴的大小时调用一些函数就可以了,那么最简单的方法就是绑定到轴生成的xlim_changed和ylim_changed事件。例如:
xlim_changed
ylim_changed
def on_xlim_change(*args): print "do your pushing and popping here..." ax = gca() ax.callbacks.connect('xlim_changed',on_xlim_change)
每当您按下前进键、后退键或home键以及使用平移或缩放工具(至少在WX和GTK后端)时,都会执行此回调。但是,它仍然在matplotlib完成其通常的轴重缩放之后执行。
如果您真的想直接访问这些按钮回调,那么我看不到一个简单的独立于后端的方法,因为事件处理将根据您使用的后端不同而工作。我认为基本的方法是对matplotlib.backends.backend_<name>.NavigationToolbar2<name>进行子类划分,并重写forward、back和home方法。根据您使用的特定后端,您仍然需要弄清楚如何合并新的工具栏类。
matplotlib.backends.backend_<name>.NavigationToolbar2<name>
forward
back
home
如果要实现一些与设置轴限制无关的自定义“向前/向后”控件,那么最好使用widgets。
我不知道这个问题的后端独立解决方案。但是,当您使用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”按钮事件。
要添加将使用“home”、“back”或“forward”按钮事件调用的回调,一种常见的方法是将matplotlib后端子类化。 但我不赞成这种做法。我认为它有两个缺点:
因为matplotlib提供的后端没有覆盖NavigationToolbar2的home、back和forward方法。我更喜欢更简洁的猴子修补方法。 例如,您可以用自己的方法替换NavigationToolbar2的home。
NavigationToolbar2
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_connect风格。
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()
如果只要在调整x或y轴的大小时调用一些函数就可以了,那么最简单的方法就是绑定到轴生成的
xlim_changed
和ylim_changed
事件。例如:每当您按下前进键、后退键或home键以及使用平移或缩放工具(至少在WX和GTK后端)时,都会执行此回调。但是,它仍然在matplotlib完成其通常的轴重缩放之后执行。
如果您真的想直接访问这些按钮回调,那么我看不到一个简单的独立于后端的方法,因为事件处理将根据您使用的后端不同而工作。我认为基本的方法是对
matplotlib.backends.backend_<name>.NavigationToolbar2<name>
进行子类划分,并重写forward
、back
和home
方法。根据您使用的特定后端,您仍然需要弄清楚如何合并新的工具栏类。如果要实现一些与设置轴限制无关的自定义“向前/向后”控件,那么最好使用widgets。
我不知道这个问题的后端独立解决方案。但是,当您使用Qt4Agg后端时,可以尝试以下操作:
首先,我得到了当前的图形管理器,这样我就可以访问它的工具栏。然后我可以将其他回调连接到它的操作。
如果您不能选择使用QT4Agg作为后端,我们可以尝试对其他后端执行类似的操作。
Matplotlib不提供“home”、“back”或“forward”按钮事件。
要添加将使用“home”、“back”或“forward”按钮事件调用的回调,一种常见的方法是将matplotlib后端子类化。
但我不赞成这种做法。我认为它有两个缺点:
因为matplotlib提供的后端没有覆盖
NavigationToolbar2
的home
、back
和forward
方法。我更喜欢更简洁的猴子修补方法。例如,您可以用自己的方法替换
NavigationToolbar2
的home
。我们甚至可以模仿matplotlib的
mpl_connect
风格。相关问题 更多 >
编程相关推荐