matplotlibの図から「ホーム」、「戻る」、「進む」ボタンイベントを「取得」する方法を知っている人はいますか?
ボタンが押されたときにプロットが正しく動作するように、いくつかの関数を呼び出すイベントが必要です。つまり、デフォルトの動作では、必要なことを実行していません。
Matplotlib は、基礎となるデータセットが一定であり、x/y 軸の制限をリセットしてそれらのボタンを再プロットするだけでよいと想定しています。ボタンイベントがトリガーされます
matplotlibの図から「ホーム」、「戻る」、「進む」ボタンイベントを「取得」する方法を知っている人はいますか?
ボタンが押されたときにプロットが正しく動作するように、いくつかの関数を呼び出すイベントが必要です。つまり、デフォルトの動作では、必要なことを実行していません。
Matplotlib は、基礎となるデータセットが一定であり、x/y 軸の制限をリセットしてそれらのボタンを再プロットするだけでよいと想定しています。ボタンイベントがトリガーされます
Matplotlib は、「ホーム」、「戻る」、または「進む」ボタン イベントを提供しません。
「ホーム」、「戻る」、または「進む」ボタン イベントで呼び出されるコールバックを追加するための一般的な方法は、matplotlib バックエンドをサブクラス化することです。
しかし、私はこのアプローチに賛成ではありません。私はそれには2つの短所があると思います:
matplotlib によって提供されるバックエンドはどれも、およびメソッドをオーバーライドしないためNavigationToolbar2
です。私は、より簡潔なモンキー パッチを適用したアプローチを好みます。
たとえば、独自の方法でを置き換えることができます。home
back
forward
NavigationToolbar2
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()
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()
この問題に対するバックエンドに依存しない解決策を知りません。しかし、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)
最初に、現在の Figure マネージャーを取得して、そのツールバーにアクセスできるようにします。次に、追加のコールバックをそのアクションに接続できます。
QT4Agg をバックエンドとして使用できない場合は、他のバックエンドでも同様のことを試みることができます。
x 軸または y 軸のサイズが変更されるたびに何らかの関数を呼び出すだけで済む場合、最も簡単なハックは、軸によって生成されたイベントにバインドすること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)
このコールバックは、進む、戻る、またはホーム キーを押すたびに実行されるほか、パン ツールやズーム ツールを使用するときも実行されます (少なくとも WX および GTK バックエンドでは)。ただし、matplotlib が軸の通常の再スケーリングを既に行った後でも実行されます。
これらのボタン コールバックに直接アクセスしたい場合は、使用しているバックエンドによってイベント処理が異なるため、バックエンドに依存しない簡単な方法はわかりません。基本的なアプローチは、メソッドをサブクラス化matplotlib.backends.backend_<name>.NavigationToolbar2<name>
してオーバーライドすることだと思います。使用している特定のバックエンドに応じて、新しいツールバー クラスを組み込む方法を正確に把握する必要があります。forward
back
home
軸の制限の設定とはあまり関係のないカスタムの「前方/後方」コントロールを実装したい場合は、代わりにウィジェットを使用する方がよいでしょう。