2013-02-15 130 views
10

有誰知道如何「得到」的「家」,「回」和「前進」從matplotlib數字按鈕事件?matplotlib掛鉤

我需要的事件打電話給我的一些功能,例如,我的陰謀行爲正確時,這些按鈕被按下,即默認行爲是沒有做什麼,我需要做的

Matplotlib假設基礎數據集是常數和所有它需要做的是重新設置這些按鈕的X/Y軸限制和重製 - 不幸的是這種假設是不正確的我的情況 - 我有一個需要被壓入和彈出的按鍵事件被觸發

數據棧

回答

14

Matplotlib不提供「家」,「後退」或「前進」按鈕的事件。

要添加將使用'home','back'或'forward'按鈕事件調用的回調,常用的方法是對matplotlib後端進行子類化。
但我不贊成這種做法。我認爲它有兩個缺點:

  1. 如果你想使用不同的後端,你必須繼承它們的每一個。
  2. 在matplotlib之外部署您自己的後端並不重要。你的後端必須是一個必須在PYTHONPATH中的模塊。

由於沒有由matplotlib提供後端的覆蓋NavigationToolbar2homebackforward方法。我更喜歡更簡潔的猴子修補方法。
例如,您可以用您自己的方法替換NavigationToolbar2home

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風格。

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

我看到接受答案並不構成授予賞金 - 有點不直觀;很高興我注意到有一小時可以騰出空間,希望nymk能夠得到它。非常感謝所有高質量的答案 – bph 2013-03-05 12:05:56

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) 

每當你打向前,向後或HOME鍵以及當您使用平移或縮放工具(至少與WX和GTK後端)這個回調執行。但是,它仍然在matplotlib已經完成其通常的軸重新調整之後執行。

如果你真的想進入這些按鈕直接回調然後我看不到一個簡單的後端無關的方式,因爲事件處理將工作不同,具體取決於哪個後端你使用。我認爲基本的做法是將matplotlib.backends.backend_<name>.NavigationToolbar2<name>的子類別覆蓋forward,backhome方法。您仍然必須根據您正在使用的特定後端來確定如何合併新的工具欄類。

如果您想要實現一些自定義的「向前/向後」控制,它與設置軸限制無關,那麼最好使用widgets來代替。

5

我不知道這個問題的後端獨立的解決方案。但是,當您使用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作爲後端是不是你的選擇,我們可以嘗試做其他後端類似的東西。